VirtualBox

source: vbox/trunk/include/iprt/semaphore.h@ 8155

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

The Big Sun Rebranding Header Change

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 13.3 KB
Line 
1/** @file
2 * innotek Portable Runtime - Semaphore.
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_semaphore_h
31#define ___iprt_semaphore_h
32
33#include <iprt/cdefs.h>
34#include <iprt/types.h>
35
36
37__BEGIN_DECLS
38
39/** @defgroup grp_rt_sems RTSem - Semaphores
40 * @ingroup grp_rt
41 * @{
42 */
43
44
45/**
46 * Create a event semaphore.
47 *
48 * @returns iprt status code.
49 * @param pEventSem Where to store the event semaphore handle.
50 */
51RTDECL(int) RTSemEventCreate(PRTSEMEVENT pEventSem);
52
53/**
54 * Destroy an event semaphore.
55 *
56 * @returns iprt status code.
57 * @param EventSem Handle of the
58 */
59RTDECL(int) RTSemEventDestroy(RTSEMEVENT EventSem);
60
61/**
62 * Signal an event semaphore.
63 *
64 * The event semaphore will be signaled and automatically reset
65 * after exactly one thread have successfully returned from
66 * RTSemEventWait() after waiting/polling on that semaphore.
67 *
68 * @returns iprt status code.
69 * @param EventSem The event semaphore to signal.
70 */
71RTDECL(int) RTSemEventSignal(RTSEMEVENT EventSem);
72
73/**
74 * Wait for the event semaphore to be signaled, resume on interruption.
75 *
76 * This function will resume if the wait is interrupted by an async
77 * system event (like a unix signal) or similar.
78 *
79 * @returns iprt status code.
80 * Will not return VERR_INTERRUPTED.
81 * @param EventSem The event semaphore to wait on.
82 * @param cMillies Number of milliseconds to wait.
83 */
84RTDECL(int) RTSemEventWait(RTSEMEVENT EventSem, unsigned cMillies);
85
86/**
87 * Wait for the event semaphore to be signaled, return on interruption.
88 *
89 * This function will not resume the wait if interrupted.
90 *
91 * @returns iprt status code.
92 * @param EventSem The event semaphore to wait on.
93 * @param cMillies Number of milliseconds to wait.
94 */
95RTDECL(int) RTSemEventWaitNoResume(RTSEMEVENT EventSem, unsigned cMillies);
96
97
98
99/**
100 * Create a event multi semaphore.
101 *
102 * @returns iprt status code.
103 * @param pEventMultiSem Where to store the event multi semaphore handle.
104 */
105RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI pEventMultiSem);
106
107/**
108 * Destroy an event multi semaphore.
109 *
110 * @returns iprt status code.
111 * @param EventMultiSem The event multi sempahore to destroy.
112 */
113RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI EventMultiSem);
114
115/**
116 * Signal an event multi semaphore.
117 *
118 * @returns iprt status code.
119 * @param EventMultiSem The event multi semaphore to signal.
120 */
121RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI EventMultiSem);
122
123/**
124 * Resets an event multi semaphore to non-signaled state.
125 *
126 * @returns iprt status code.
127 * @param EventMultiSem The event multi semaphore to reset.
128 */
129RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI EventMultiSem);
130
131/**
132 * Wait for the event multi semaphore to be signaled, resume on interruption.
133 *
134 * This function will resume if the wait is interrupted by an async
135 * system event (like a unix signal) or similar.
136 *
137 * @returns iprt status code.
138 * Will not return VERR_INTERRUPTED.
139 * @param EventMultiSem The event multi semaphore to wait on.
140 * @param cMillies Number of milliseconds to wait.
141 */
142RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies);
143
144
145/**
146 * Wait for the event multi semaphore to be signaled, return on interruption.
147 *
148 * This function will not resume the wait if interrupted.
149 *
150 * @returns iprt status code.
151 * @param EventMultiSem The event multi semaphore to wait on.
152 * @param cMillies Number of milliseconds to wait.
153 */
154RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies);
155
156
157
158/**
159 * Create a mutex semaphore.
160 *
161 * @returns iprt status code.
162 * @param pMutexSem Where to store the mutex semaphore handle.
163 */
164RTDECL(int) RTSemMutexCreate(PRTSEMMUTEX pMutexSem);
165
166/**
167 * Destroy a mutex semaphore.
168 *
169 * @returns iprt status code.
170 * @param MutexSem The mutex semaphore to destroy.
171 */
172RTDECL(int) RTSemMutexDestroy(RTSEMMUTEX MutexSem);
173
174/**
175 * Request ownership of a mutex semaphore, resume on interruption.
176 *
177 * This function will resume if the wait is interrupted by an async
178 * system event (like a unix signal) or similar.
179 *
180 * The same thread may request a mutex semaphore multiple times,
181 * a nested counter is kept to make sure it's released on the right
182 * RTSemMutexRelease() call.
183 *
184 * @returns iprt status code.
185 * Will not return VERR_INTERRUPTED.
186 * @param MutexSem The mutex semaphore to request ownership over.
187 * @param cMillies The number of milliseconds to wait.
188 */
189RTDECL(int) RTSemMutexRequest(RTSEMMUTEX MutexSem, unsigned cMillies);
190
191/**
192 * Request ownership of a mutex semaphore, return on interruption.
193 *
194 * This function will not resume the wait if interrupted.
195 *
196 * The same thread may request a mutex semaphore multiple times,
197 * a nested counter is kept to make sure it's released on the right
198 * RTSemMutexRelease() call.
199 *
200 * @returns iprt status code.
201 * @param MutexSem The mutex semaphore to request ownership over.
202 * @param cMillies The number of milliseconds to wait.
203 */
204RTDECL(int) RTSemMutexRequestNoResume(RTSEMMUTEX MutexSem, unsigned cMillies);
205
206/**
207 * Release the ownership of a mutex semaphore.
208 *
209 * @returns iprt status code.
210 * @param MutexSem The mutex to release the ownership of.
211 * It goes without saying the the calling thread must own it.
212 */
213RTDECL(int) RTSemMutexRelease(RTSEMMUTEX MutexSem);
214
215
216/**
217 * Create a fast mutex semaphore.
218 *
219 * @returns iprt status code.
220 * @param pMutexSem Where to store the mutex semaphore handle.
221 */
222RTDECL(int) RTSemFastMutexCreate(PRTSEMFASTMUTEX pMutexSem);
223
224/**
225 * Destroy a fast mutex semaphore.
226 *
227 * @returns iprt status code.
228 * @param MutexSem The mutex semaphore to destroy.
229 */
230RTDECL(int) RTSemFastMutexDestroy(RTSEMFASTMUTEX MutexSem);
231
232/**
233 * Request ownership of a fast mutex semaphore.
234 *
235 * The same thread may request a mutex semaphore multiple times,
236 * a nested counter is kept to make sure it's released on the right
237 * RTSemMutexRelease() call.
238 *
239 * @returns iprt status code.
240 * @param MutexSem The mutex semaphore to request ownership over.
241 */
242RTDECL(int) RTSemFastMutexRequest(RTSEMFASTMUTEX MutexSem);
243
244/**
245 * Release the ownership of a fast mutex semaphore.
246 *
247 * @returns iprt status code.
248 * @param MutexSem The mutex to release the ownership of.
249 * It goes without saying the the calling thread must own it.
250 */
251RTDECL(int) RTSemFastMutexRelease(RTSEMFASTMUTEX MutexSem);
252
253
254/**
255 * Creates a read/write semaphore.
256 *
257 * @returns iprt status code.
258 * @param pRWSem Where to store the handle to the created RW semaphore.
259 */
260RTDECL(int) RTSemRWCreate(PRTSEMRW pRWSem);
261
262/**
263 * Destroys a read/write semaphore.
264 *
265 * @returns iprt status code.
266 * @param RWSem The Read/Write semaphore to destroy.
267 */
268RTDECL(int) RTSemRWDestroy(RTSEMRW RWSem);
269
270/**
271 * Request read access to a read/write semaphore, resume on interruption
272 *
273 * @returns iprt status code.
274 * @retval VINF_SUCCESS on success.
275 * @retval VERR_INTERRUPT if the wait was interrupted.
276 * @retval VERR_INVALID_HANDLE if RWSem is invalid.
277 *
278 * @param RWSem The Read/Write semaphore to request read access to.
279 * @param cMillies The number of milliseconds to wait.
280 */
281RTDECL(int) RTSemRWRequestRead(RTSEMRW RWSem, unsigned cMillies);
282
283/**
284 * Request read access to a read/write semaphore, return on interruption
285 *
286 * @returns iprt status code.
287 * @retval VINF_SUCCESS on success.
288 * @retval VERR_INTERRUPT if the wait was interrupted.
289 * @retval VERR_INVALID_HANDLE if RWSem is invalid.
290 *
291 * @param RWSem The Read/Write semaphore to request read access to.
292 * @param cMillies The number of milliseconds to wait.
293 */
294RTDECL(int) RTSemRWRequestReadNoResume(RTSEMRW RWSem, unsigned cMillies);
295
296/**
297 * Release read access to a read/write semaphore.
298 *
299 * @returns iprt status code.
300 * @param RWSem The Read/Write sempahore to release read access to.
301 * Goes without saying that caller must have read access to the sem.
302 */
303RTDECL(int) RTSemRWReleaseRead(RTSEMRW RWSem);
304
305/**
306 * Request write access to a read/write semaphore, resume on interruption.
307 *
308 * @returns iprt status code.
309 * @retval VINF_SUCCESS on success.
310 * @retval VERR_DEADLOCK if the caller owned the read lock.
311 * @retval VERR_INVALID_HANDLE if RWSem is invalid.
312 *
313 * @param RWSem The Read/Write semaphore to request write access to.
314 * @param cMillies The number of milliseconds to wait.
315 */
316RTDECL(int) RTSemRWRequestWrite(RTSEMRW RWSem, unsigned cMillies);
317
318/**
319 * Request write access to a read/write semaphore, return on interruption.
320 *
321 * @returns iprt status code.
322 * @retval VINF_SUCCESS on success.
323 * @retval VERR_INTERRUPT if the wait was interrupted.
324 * @retval VERR_DEADLOCK if the caller owned the read lock.
325 * @retval VERR_INVALID_HANDLE if RWSem is invalid.
326 *
327 * @param RWSem The Read/Write semaphore to request write access to.
328 * @param cMillies The number of milliseconds to wait.
329 */
330RTDECL(int) RTSemRWRequestWriteNoResume(RTSEMRW RWSem, unsigned cMillies);
331
332/**
333 * Release write access to a read/write semaphore.
334 *
335 * @returns iprt status code.
336 * @param RWSem The Read/Write sempahore to release read access to.
337 * Goes without saying that caller must have write access to the sem.
338 */
339RTDECL(int) RTSemRWReleaseWrite(RTSEMRW RWSem);
340
341
342
343/**
344 * Ping-pong speaker
345 */
346typedef enum RTPINGPONGSPEAKER
347{
348 /** Not initialized. */
349 RTPINGPONGSPEAKER_UNINITIALIZE = 0,
350 /** Ping is speaking, Pong is waiting. */
351 RTPINGPONGSPEAKER_PING,
352 /** Pong is signaled, Ping is waiting. */
353 RTPINGPONGSPEAKER_PONG_SIGNALED,
354 /** Pong is speaking, Ping is waiting. */
355 RTPINGPONGSPEAKER_PONG,
356 /** Ping is signaled, Pong is waiting. */
357 RTPINGPONGSPEAKER_PING_SIGNALED,
358 /** Hack to ensure that it's at least 32-bits wide. */
359 RTPINGPONGSPEAKER_HACK = 0x7fffffff
360} RTPINGPONGSPEAKER;
361
362/**
363 * Ping-Pong construct.
364 *
365 * Two threads, one saying Ping and the other saying Pong. The construct
366 * makes sure they don't speak out of turn and that they can wait and poll
367 * on the conversation.
368 */
369typedef struct RTPINGPONG
370{
371 /** The semaphore the Ping thread waits on. */
372 RTSEMEVENT Ping;
373 /** The semaphore the Pong thread waits on. */
374 RTSEMEVENT Pong;
375 /** The current speaker. */
376 volatile RTPINGPONGSPEAKER enmSpeaker;
377#if HC_ARCH_BITS == 64
378 /** Padding the structure to become a multiple of sizeof(RTHCPTR). */
379 uint32_t u32Padding;
380#endif
381} RTPINGPONG;
382/** Pointer to Ping-Pong construct. */
383typedef RTPINGPONG *PRTPINGPONG;
384
385/**
386 * Init a Ping-Pong construct.
387 *
388 * @returns iprt status code.
389 * @param pPP Pointer to the ping-pong structure which needs initialization.
390 */
391RTDECL(int) RTSemPingPongInit(PRTPINGPONG pPP);
392
393/**
394 * Destroys a Ping-Pong construct.
395 *
396 * @returns iprt status code.
397 * @param pPP Pointer to the ping-pong structure which is to be destroyed.
398 * (I.e. put into uninitialized state.)
399 */
400RTDECL(int) RTSemPingPongDestroy(PRTPINGPONG pPP);
401
402/**
403 * Signals the pong thread in a ping-pong construct. (I.e. sends ping.)
404 * This is called by the ping thread.
405 *
406 * @returns iprt status code.
407 * @param pPP Pointer to the ping-pong structure to ping.
408 */
409RTDECL(int) RTSemPing(PRTPINGPONG pPP);
410
411/**
412 * Signals the ping thread in a ping-pong construct. (I.e. sends pong.)
413 * This is called by the pong thread.
414 *
415 * @returns iprt status code.
416 * @param pPP Pointer to the ping-pong structure to pong.
417 */
418RTDECL(int) RTSemPong(PRTPINGPONG pPP);
419
420/**
421 * Wait function for the ping thread.
422 *
423 * @returns iprt status code.
424 * Will not return VERR_INTERRUPTED.
425 * @param pPP Pointer to the ping-pong structure to wait on.
426 * @param cMillies Number of milliseconds to wait.
427 */
428RTDECL(int) RTSemPingWait(PRTPINGPONG pPP, unsigned cMillies);
429
430/**
431 * Wait function for the pong thread.
432 *
433 * @returns iprt status code.
434 * Will not return VERR_INTERRUPTED.
435 * @param pPP Pointer to the ping-pong structure to wait on.
436 * @param cMillies Number of milliseconds to wait.
437 */
438RTDECL(int) RTSemPongWait(PRTPINGPONG pPP, unsigned cMillies);
439
440/** @} */
441
442__END_DECLS
443
444#endif
445
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use