VirtualBox

source: vbox/trunk/include/VBox/pdmqueue.h@ 9721

Last change on this file since 9721 was 9387, checked in by vboxsync, 17 years ago

64-bit GC alignment fixes

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 10.1 KB
Line 
1/** @file
2 * PDM - Pluggable Device Manager, Queues.
3 */
4
5/*
6 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 *
25 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
26 * Clara, CA 95054 USA or visit http://www.sun.com if you need
27 * additional information or have any questions.
28 */
29
30#ifndef ___VBox_pdmqueue_h
31#define ___VBox_pdmqueue_h
32
33#include <VBox/types.h>
34
35__BEGIN_DECLS
36
37/** @defgroup grp_pdm_queue Queues
38 * @ingroup grp_pdm
39 * @{
40 */
41
42/** Pointer to a PDM queue. Also called PDM queue handle. */
43typedef struct PDMQUEUE *PPDMQUEUE;
44
45/** Pointer to a PDM queue item core. */
46typedef struct PDMQUEUEITEMCORE *PPDMQUEUEITEMCORE;
47
48/**
49 * PDM queue item core.
50 */
51typedef struct PDMQUEUEITEMCORE
52{
53 /** Pointer to the next item in the pending list - HC Pointer. */
54 R3R0PTRTYPE(PPDMQUEUEITEMCORE) pNextHC;
55 /** Pointer to the next item in the pending list - GC Pointer. */
56 RCPTRTYPE(PPDMQUEUEITEMCORE) pNextGC;
57#if HC_ARCH_BITS == 64
58 uint32_t Alignment0;
59#endif
60} PDMQUEUEITEMCORE;
61
62
63/**
64 * Queue consumer callback for devices.
65 *
66 * @returns Success indicator.
67 * If false the item will not be removed and the flushing will stop.
68 * @param pDevIns The device instance.
69 * @param pItem The item to consume. Upon return this item will be freed.
70 */
71typedef DECLCALLBACK(bool) FNPDMQUEUEDEV(PPDMDEVINS pDevIns, PPDMQUEUEITEMCORE pItem);
72/** Pointer to a FNPDMQUEUEDEV(). */
73typedef FNPDMQUEUEDEV *PFNPDMQUEUEDEV;
74
75/**
76 * Queue consumer callback for drivers.
77 *
78 * @returns Success indicator.
79 * If false the item will not be removed and the flushing will stop.
80 * @param pDrvIns The driver instance.
81 * @param pItem The item to consume. Upon return this item will be freed.
82 */
83typedef DECLCALLBACK(bool) FNPDMQUEUEDRV(PPDMDRVINS pDrvIns, PPDMQUEUEITEMCORE pItem);
84/** Pointer to a FNPDMQUEUEDRV(). */
85typedef FNPDMQUEUEDRV *PFNPDMQUEUEDRV;
86
87/**
88 * Queue consumer callback for internal component.
89 *
90 * @returns Success indicator.
91 * If false the item will not be removed and the flushing will stop.
92 * @param pVM The VM handle.
93 * @param pItem The item to consume. Upon return this item will be freed.
94 */
95typedef DECLCALLBACK(bool) FNPDMQUEUEINT(PVM pVM, PPDMQUEUEITEMCORE pItem);
96/** Pointer to a FNPDMQUEUEINT(). */
97typedef FNPDMQUEUEINT *PFNPDMQUEUEINT;
98
99/**
100 * Queue consumer callback for external component.
101 *
102 * @returns Success indicator.
103 * If false the item will not be removed and the flushing will stop.
104 * @param pvUser User argument.
105 * @param pItem The item to consume. Upon return this item will be freed.
106 */
107typedef DECLCALLBACK(bool) FNPDMQUEUEEXT(void *pvUser, PPDMQUEUEITEMCORE pItem);
108/** Pointer to a FNPDMQUEUEEXT(). */
109typedef FNPDMQUEUEEXT *PFNPDMQUEUEEXT;
110
111/**
112 * Create a queue with a device owner.
113 *
114 * @returns VBox status code.
115 * @param pVM VM handle.
116 * @param pDevIns Device instance.
117 * @param cbItem Size a queue item.
118 * @param cItems Number of items in the queue.
119 * @param cMilliesInterval Number of milliseconds between polling the queue.
120 * If 0 then the emulation thread will be notified whenever an item arrives.
121 * @param pfnCallback The consumer function.
122 * @param fGCEnabled Set if the queue must be usable from GC.
123 * @param ppQueue Where to store the queue handle on success.
124 * @thread Emulation thread only.
125 */
126PDMR3DECL(int) PDMR3QueueCreateDevice(PVM pVM, PPDMDEVINS pDevIns, RTUINT cbItem, RTUINT cItems, uint32_t cMilliesInterval,
127 PFNPDMQUEUEDEV pfnCallback, bool fGCEnabled, PPDMQUEUE *ppQueue);
128
129/**
130 * Create a queue with a driver owner.
131 *
132 * @returns VBox status code.
133 * @param pVM VM handle.
134 * @param pDrvIns Driver instance.
135 * @param cbItem Size a queue item.
136 * @param cItems Number of items in the queue.
137 * @param cMilliesInterval Number of milliseconds between polling the queue.
138 * If 0 then the emulation thread will be notified whenever an item arrives.
139 * @param pfnCallback The consumer function.
140 * @param ppQueue Where to store the queue handle on success.
141 * @thread The emulation thread.
142 */
143PDMR3DECL(int) PDMR3QueueCreateDriver(PVM pVM, PPDMDRVINS pDrvIns, RTUINT cbItem, RTUINT cItems, uint32_t cMilliesInterval,
144 PFNPDMQUEUEDRV pfnCallback, PPDMQUEUE *ppQueue);
145
146/**
147 * Create a queue with an internal owner.
148 *
149 * @returns VBox status code.
150 * @param pVM VM handle.
151 * @param cbItem Size a queue item.
152 * @param cItems Number of items in the queue.
153 * @param cMilliesInterval Number of milliseconds between polling the queue.
154 * If 0 then the emulation thread will be notified whenever an item arrives.
155 * @param pfnCallback The consumer function.
156 * @param fGCEnabled Set if the queue must be usable from GC.
157 * @param ppQueue Where to store the queue handle on success.
158 * @thread Emulation thread only.
159 */
160PDMR3DECL(int) PDMR3QueueCreateInternal(PVM pVM, RTUINT cbItem, RTUINT cItems, uint32_t cMilliesInterval,
161 PFNPDMQUEUEINT pfnCallback, bool fGCEnabled, PPDMQUEUE *ppQueue);
162
163/**
164 * Create a queue with an external owner.
165 *
166 * @returns VBox status code.
167 * @param pVM VM handle.
168 * @param cbItem Size a queue item.
169 * @param cItems Number of items in the queue.
170 * @param cMilliesInterval Number of milliseconds between polling the queue.
171 * If 0 then the emulation thread will be notified whenever an item arrives.
172 * @param pfnCallback The consumer function.
173 * @param pvUser The user argument to the consumer function.
174 * @param ppQueue Where to store the queue handle on success.
175 * @thread The emulation thread.
176 */
177PDMR3DECL(int) PDMR3QueueCreateExternal(PVM pVM, RTUINT cbItem, RTUINT cItems, uint32_t cMilliesInterval,
178 PFNPDMQUEUEEXT pfnCallback, void *pvUser, PPDMQUEUE *ppQueue);
179
180/**
181 * Destroy a queue.
182 *
183 * @returns VBox status code.
184 * @param pQueue Queue to destroy.
185 * @thread The emulation thread.
186 */
187PDMR3DECL(int) PDMR3QueueDestroy(PPDMQUEUE pQueue);
188
189/**
190 * Destroy a all queues owned by the specified device.
191 *
192 * @returns VBox status code.
193 * @param pVM VM handle.
194 * @param pDevIns Device instance.
195 * @thread Emulation thread only.
196 */
197PDMR3DECL(int) PDMR3QueueDestroyDevice(PVM pVM, PPDMDEVINS pDevIns);
198
199/**
200 * Destroy a all queues owned by the specified driver.
201 *
202 * @returns VBox status code.
203 * @param pVM VM handle.
204 * @param pDrvIns Driver instance.
205 * @thread Emulation thread only.
206 */
207PDMR3DECL(int) PDMR3QueueDestroyDriver(PVM pVM, PPDMDRVINS pDrvIns);
208
209/**
210 * Flushes pending queues.
211 * This is a forced action callback.
212 *
213 * @param pVM VM handle.
214 * @thread The emulation thread.
215 */
216PDMR3DECL(void) PDMR3QueueFlushAll(PVM pVM);
217
218/**
219 * This is a worker function used by PDMQueueFlush to perform the
220 * flush in ring-3.
221 *
222 * The queue which should be flushed is pointed to by either pQueueFlushGC,
223 * pQueueFlushHC, or pQueueue. This function will flush that queue and
224 * recalc the queue FF.
225 *
226 * @param pVM The VM handle.
227 * @param pQueue The queue to flush. Only used in Ring-3.
228 */
229PDMR3DECL(void) PDMR3QueueFlushWorker(PVM pVM, PPDMQUEUE pQueue);
230
231/**
232 * Flushes a PDM queue.
233 *
234 * @param pQueue The queue handle.
235 */
236PDMDECL(void) PDMQueueFlush(PPDMQUEUE pQueue);
237
238/**
239 * Allocate an item from a queue.
240 * The allocated item must be handed on to PDMQueueInsert() after the
241 * data has been filled in.
242 *
243 * @returns Pointer to allocated queue item.
244 * @returns NULL on failure. The queue is exhausted.
245 * @param pQueue The queue handle.
246 * @thread Any thread.
247 */
248PDMDECL(PPDMQUEUEITEMCORE) PDMQueueAlloc(PPDMQUEUE pQueue);
249
250/**
251 * Queue an item.
252 * The item must have been obtained using PDMQueueAlloc(). Once the item
253 * has been passed to this function it must not be touched!
254 *
255 * @param pQueue The queue handle.
256 * @param pItem The item to insert.
257 * @thread Any thread.
258 */
259PDMDECL(void) PDMQueueInsert(PPDMQUEUE pQueue, PPDMQUEUEITEMCORE pItem);
260
261/**
262 * Queue an item.
263 * The item must have been obtained using PDMQueueAlloc(). Once the item
264 * have been passed to this function it must not be touched!
265 *
266 * @param pQueue The queue handle.
267 * @param pItem The item to insert.
268 * @param NanoMaxDelay The maximum delay before processing the queue, in nanoseconds.
269 * This applies only to GC.
270 * @thread Any thread.
271 */
272PDMDECL(void) PDMQueueInsertEx(PPDMQUEUE pQueue, PPDMQUEUEITEMCORE pItem, uint64_t NanoMaxDelay);
273
274
275/**
276 * Gets the GC pointer for the specified queue.
277 *
278 * @returns The GC address of the queue.
279 * @returns NULL if pQueue is invalid.
280 * @param pQueue The queue handle.
281 */
282PDMDECL(RCPTRTYPE(PPDMQUEUE)) PDMQueueGCPtr(PPDMQUEUE pQueue);
283
284/** @} */
285
286__END_DECLS
287
288#endif
289
290
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette