VirtualBox

source: vbox/trunk/include/iprt/req.h@ 16214

Last change on this file since 16214 was 13075, checked in by vboxsync, 16 years ago

more accurate docs. restored the 64-bit warning.

  • Property eol-style set to native
File size: 13.2 KB
Line 
1/** @file
2 * IPRT - Request packets
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 ___iprt_req_h
31#define ___iprt_req_h
32
33#include <iprt/cdefs.h>
34#include <iprt/types.h>
35
36#include <iprt/stdarg.h>
37
38__BEGIN_DECLS
39
40/** @defgroup grp_rt_req RTReq - Request Packet Management
41 * @ingroup grp_rt
42 * @{
43 */
44
45/**
46 * Request type.
47 */
48typedef enum RTREQTYPE
49{
50 /** Invalid request. */
51 RTREQTYPE_INVALID = 0,
52 /** RT: Internal. */
53 RTREQTYPE_INTERNAL,
54 /** Maximum request type (exclusive). Used for validation. */
55 RTREQTYPE_MAX
56} RTREQTYPE;
57
58/**
59 * Request state.
60 */
61typedef enum RTREQSTATE
62{
63 /** The state is invalid. */
64 RTREQSTATE_INVALID = 0,
65 /** The request have been allocated and is in the process of being filed. */
66 RTREQSTATE_ALLOCATED,
67 /** The request is queued by the requester. */
68 RTREQSTATE_QUEUED,
69 /** The request is begin processed. */
70 RTREQSTATE_PROCESSING,
71 /** The request is completed, the requester is begin notified. */
72 RTREQSTATE_COMPLETED,
73 /** The request packet is in the free chain. (The requester */
74 RTREQSTATE_FREE
75} RTREQSTATE;
76
77/**
78 * Request flags.
79 */
80typedef enum RTREQFLAGS
81{
82 /** The request returns a iprt status code. */
83 RTREQFLAGS_IPRT_STATUS = 0,
84 /** The request is a void request and have no status code. */
85 RTREQFLAGS_VOID = 1,
86 /** Return type mask. */
87 RTREQFLAGS_RETURN_MASK = 1,
88 /** Caller does not wait on the packet, Queue process thread will free it. */
89 RTREQFLAGS_NO_WAIT = 2
90} RTREQFLAGS;
91
92/** Pointer to a request queue. */
93typedef struct RTREQQUEUE *PRTREQQUEUE;
94
95/**
96 * RT Request packet.
97 *
98 * This is used to request an action in the queue handler thread.
99 */
100typedef struct RTREQ
101{
102 /** Pointer to the next request in the chain. */
103 struct RTREQ * volatile pNext;
104 /** Pointer to the queue this packet belongs to. */
105 PRTREQQUEUE pQueue;
106 /** Request state. */
107 volatile RTREQSTATE enmState;
108 /** iprt status code for the completed request. */
109 volatile int iStatus;
110 /** Requester event sem.
111 * The request can use this event semaphore to wait/poll for completion
112 * of the request.
113 */
114 RTSEMEVENT EventSem;
115 /** Set if the event semaphore is clear. */
116 volatile bool fEventSemClear;
117 /** Flags, RTREQ_FLAGS_*. */
118 unsigned fFlags;
119 /** Request type. */
120 RTREQTYPE enmType;
121 /** Request specific data. */
122 union RTREQ_U
123 {
124 /** RTREQTYPE_INTERNAL. */
125 struct
126 {
127 /** Pointer to the function to be called. */
128 PFNRT pfn;
129 /** Number of arguments. */
130 unsigned cArgs;
131 /** Array of arguments. */
132 uintptr_t aArgs[64];
133 } Internal;
134 } u;
135} RTREQ;
136/** Pointer to an RT request packet. */
137typedef RTREQ *PRTREQ;
138
139/** @todo hide this */
140typedef struct RTREQQUEUE
141{
142 /** Head of the request queue. Atomic. */
143 volatile PRTREQ pReqs;
144 /** The last index used during alloc/free. */
145 volatile uint32_t iReqFree;
146 /** Number of free request packets. */
147 volatile uint32_t cReqFree;
148 /** Array of pointers to lists of free request packets. Atomic. */
149 volatile PRTREQ apReqFree[9];
150 /** Requester event sem.
151 * The request can use this event semaphore to wait/poll for new requests.
152 */
153 RTSEMEVENT EventSem;
154} RTREQQUEUE;
155
156#ifdef IN_RING3
157
158/**
159 * Create a request packet queueu
160 *
161 * @returns iprt status code.
162 * @param ppQueue Where to store the request queue pointer.
163 */
164RTDECL(int) RTReqCreateQueue(PRTREQQUEUE *ppQueue);
165
166
167/**
168 * Destroy a request packet queueu
169 *
170 * @returns iprt status code.
171 * @param pQueue The request queue.
172 */
173RTDECL(int) RTReqDestroyQueue(PRTREQQUEUE pQueue);
174
175
176/**
177 * Process one or more request packets
178 *
179 * @returns iprt status code.
180 * @returns VERR_TIMEOUT if cMillies was reached without the packet being added.
181 *
182 * @param pQueue The request queue.
183 * @param cMillies Number of milliseconds to wait for a pending request.
184 * Use RT_INDEFINITE_WAIT to only wait till one is added.
185 */
186RTDECL(int) RTReqProcess(PRTREQQUEUE pQueue, unsigned cMillies);
187
188
189/**
190 * Allocate and queue a call request.
191 *
192 * If it's desired to poll on the completion of the request set cMillies
193 * to 0 and use RTReqWait() to check for completation. In the other case
194 * use RT_INDEFINITE_WAIT.
195 * The returned request packet must be freed using RTReqFree().
196 *
197 * @returns iprt statuscode.
198 * Will not return VERR_INTERRUPTED.
199 * @returns VERR_TIMEOUT if cMillies was reached without the packet being completed.
200 *
201 * @param pQueue The request queue.
202 * @param ppReq Where to store the pointer to the request.
203 * This will be NULL or a valid request pointer not matter what happends.
204 * @param cMillies Number of milliseconds to wait for the request to
205 * be completed. Use RT_INDEFINITE_WAIT to only
206 * wait till it's completed.
207 * @param pfnFunction Pointer to the function to call.
208 * @param cArgs Number of arguments following in the ellipsis.
209 * The arguments must be of integer or pointer type and
210 * not bigger in size than uintptr_t. Do not try pass
211 * 64-bit integers directly in portable code.
212 * @param ... Function arguments.
213 */
214RTDECL(int) RTReqCall(PRTREQQUEUE pQueue, PRTREQ *ppReq, unsigned cMillies, PFNRT pfnFunction, unsigned cArgs, ...);
215
216
217/**
218 * Allocate and queue a call request to a void function.
219 *
220 * If it's desired to poll on the completion of the request set cMillies
221 * to 0 and use RTReqWait() to check for completation. In the other case
222 * use RT_INDEFINITE_WAIT.
223 * The returned request packet must be freed using RTReqFree().
224 *
225 * @returns iprt status code.
226 * Will not return VERR_INTERRUPTED.
227 * @returns VERR_TIMEOUT if cMillies was reached without the packet being completed.
228 *
229 * @param pQueue The request queue.
230 * @param ppReq Where to store the pointer to the request.
231 * This will be NULL or a valid request pointer not matter what happends.
232 * @param cMillies Number of milliseconds to wait for the request to
233 * be completed. Use RT_INDEFINITE_WAIT to only
234 * wait till it's completed.
235 * @param pfnFunction Pointer to the function to call.
236 * @param cArgs Number of arguments following in the ellipsis.
237 * The arguments must be of integer or pointer type and
238 * not bigger in size than uintptr_t. Do not try pass
239 * 64-bit integers directly in portable code.
240 * @param ... Function arguments.
241 */
242RTDECL(int) RTReqCallVoid(PRTREQQUEUE pQueue, PRTREQ *ppReq, unsigned cMillies, PFNRT pfnFunction, unsigned cArgs, ...);
243
244
245/**
246 * Allocate and queue a call request to a void function.
247 *
248 * If it's desired to poll on the completion of the request set cMillies
249 * to 0 and use RTReqWait() to check for completation. In the other case
250 * use RT_INDEFINITE_WAIT.
251 * The returned request packet must be freed using RTReqFree().
252 *
253 * @returns iprt status code.
254 * Will not return VERR_INTERRUPTED.
255 * @returns VERR_TIMEOUT if cMillies was reached without the packet being completed.
256 *
257 * @param pQueue The request queue.
258 * @param ppReq Where to store the pointer to the request.
259 * This will be NULL or a valid request pointer not matter what happends, unless fFlags
260 * contains RTREQFLAGS_NO_WAIT when it will be optional and always NULL.
261 * @param cMillies Number of milliseconds to wait for the request to
262 * be completed. Use RT_INDEFINITE_WAIT to only
263 * wait till it's completed.
264 * @param fFlags A combination of the RTREQFLAGS values.
265 * @param pfnFunction Pointer to the function to call.
266 * @param cArgs Number of arguments following in the ellipsis.
267 * The arguments must be of integer or pointer type and
268 * not bigger in size than uintptr_t. Do not try pass
269 * 64-bit integers directly in portable code.
270 * @param ... Function arguments.
271 */
272RTDECL(int) RTReqCallEx(PRTREQQUEUE pQueue, PRTREQ *ppReq, unsigned cMillies, unsigned fFlags, PFNRT pfnFunction, unsigned cArgs, ...);
273
274
275/**
276 * Allocate and queue a call request.
277 *
278 * If it's desired to poll on the completion of the request set cMillies
279 * to 0 and use RTReqWait() to check for completation. In the other case
280 * use RT_INDEFINITE_WAIT.
281 * The returned request packet must be freed using RTReqFree().
282 *
283 * @returns iprt status code.
284 * Will not return VERR_INTERRUPTED.
285 * @returns VERR_TIMEOUT if cMillies was reached without the packet being completed.
286 *
287 * @param pQueue The request queue.
288 * @param ppReq Where to store the pointer to the request.
289 * This will be NULL or a valid request pointer not matter what happends, unless fFlags
290 * contains RTREQFLAGS_NO_WAIT when it will be optional and always NULL.
291 * @param cMillies Number of milliseconds to wait for the request to
292 * be completed. Use RT_INDEFINITE_WAIT to only
293 * wait till it's completed.
294 * @param fFlags A combination of the RTREQFLAGS values.
295 * @param pfnFunction Pointer to the function to call.
296 * @param cArgs Number of arguments following in the ellipsis.
297 * The arguments must be of integer or pointer type and
298 * not bigger in size than uintptr_t. Do not try pass
299 * 64-bit integers directly in portable code.
300 * @param Args Variable argument vector.
301 */
302RTDECL(int) RTReqCallV(PRTREQQUEUE pQueue, PRTREQ *ppReq, unsigned cMillies, unsigned fFlags, PFNRT pfnFunction, unsigned cArgs, va_list Args);
303
304
305/**
306 * Allocates a request packet.
307 *
308 * The caller allocates a request packet, fills in the request data
309 * union and queues the request.
310 *
311 * @returns iprt status code.
312 *
313 * @param pQueue The request queue.
314 * @param ppReq Where to store the pointer to the allocated packet.
315 * @param enmType Package type.
316 */
317RTDECL(int) RTReqAlloc(PRTREQQUEUE pQueue, PRTREQ *ppReq, RTREQTYPE enmType);
318
319
320/**
321 * Free a request packet.
322 *
323 * @returns iprt status code.
324 *
325 * @param pReq Package to free.
326 * @remark The request packet must be in allocated or completed state!
327 */
328RTDECL(int) RTReqFree(PRTREQ pReq);
329
330
331/**
332 * Queue a request.
333 *
334 * The quest must be allocated using RTReqAlloc() and contain
335 * all the required data.
336 * If it's disired to poll on the completion of the request set cMillies
337 * to 0 and use RTReqWait() to check for completation. In the other case
338 * use RT_INDEFINITE_WAIT.
339 *
340 * @returns iprt status code.
341 * Will not return VERR_INTERRUPTED.
342 * @returns VERR_TIMEOUT if cMillies was reached without the packet being completed.
343 *
344 * @param pReq The request to queue.
345 * @param cMillies Number of milliseconds to wait for the request to
346 * be completed. Use RT_INDEFINITE_WAIT to only
347 * wait till it's completed.
348 */
349RTDECL(int) RTReqQueue(PRTREQ pReq, unsigned cMillies);
350
351
352/**
353 * Wait for a request to be completed.
354 *
355 * @returns iprt status code.
356 * Will not return VERR_INTERRUPTED.
357 * @returns VERR_TIMEOUT if cMillies was reached without the packet being completed.
358 *
359 * @param pReq The request to wait for.
360 * @param cMillies Number of milliseconds to wait.
361 * Use RT_INDEFINITE_WAIT to only wait till it's completed.
362 */
363RTDECL(int) RTReqWait(PRTREQ pReq, unsigned cMillies);
364
365
366#endif /* IN_RING3 */
367
368
369/** @} */
370
371__END_DECLS
372
373#endif
374
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