2 * mono-semaphore.h: Definitions for generic semaphore usage
5 * Geoff Norton <gnorton@novell.com>
7 * (C) 2009 Novell, Inc.
10 #ifndef _MONO_SEMAPHORE_H_
11 #define _MONO_SEMAPHORE_H_
15 #ifdef HAVE_SEMAPHORE_H
16 #include <semaphore.h>
18 #include <mono/io-layer/io-layer.h>
20 #if defined (HAVE_SEMAPHORE_H) || defined (USE_MACH_SEMA)
21 # define MONO_HAS_SEMAPHORES
23 # if defined (USE_MACH_SEMA)
24 # include <mach/mach_init.h>
25 # include <mach/task.h>
26 # include <mach/semaphore.h>
27 typedef semaphore_t MonoSemType;
28 # define MONO_SEM_INIT(addr,value) semaphore_create (current_task (), (addr), SYNC_POLICY_FIFO, (value))
29 # define MONO_SEM_WAIT(sem) semaphore_wait (*(sem))
30 # define MONO_SEM_POST(sem) semaphore_signal (*(sem))
31 # define MONO_SEM_DESTROY(sem) semaphore_destroy (current_task (), *(sem))
33 typedef sem_t MonoSemType;
34 # define MONO_SEM_INIT(addr,value) sem_init ((addr), 0, (value))
35 # define MONO_SEM_WAIT(sem) sem_wait ((sem))
36 # define MONO_SEM_POST(sem) sem_post ((sem))
37 # define MONO_SEM_DESTROY(sem) sem_destroy ((sem))
39 #elif defined(HOST_WIN32) || defined(_WAPI_SEMAPHORES_H)
40 # define MONO_HAS_SEMAPHORES
41 typedef HANDLE MonoSemType;
42 # define MONO_SEM_INIT(addr,initial) do {*(addr) = CreateSemaphore ( NULL,(initial),0x7FFFFFFF,NULL);} while(0)
43 # define MONO_SEM_WAIT(sem) WaitForSingleObjectEx (*(sem),INFINITE, TRUE)
44 # define MONO_SEM_POST(sem) (!(ReleaseSemaphore (*(sem),1,NULL)))
45 # define MONO_SEM_DESTROY(sem) CloseHandle (*(sem))
48 #define MONO_SEM_TIMEDWAIT(sem, timeout_ms) mono_sem_timedwait ((sem), (timeout_ms))
52 gboolean mono_sem_timedwait (MonoSemType *sem, guint32 timeout_ms);
55 #endif /* _MONO_SEMAPHORE_H_ */