591a51067de33a825792b4ff5d03241de1edbfcb
[mono.git] / mono / utils / mono-semaphore.h
1 /*
2  * mono-semaphore.h:  Definitions for generic semaphore usage
3  *
4  * Author:
5  *      Geoff Norton  <gnorton@novell.com>
6  *
7  * (C) 2009 Novell, Inc.
8  */
9
10 #ifndef _MONO_SEMAPHORE_H_
11 #define _MONO_SEMAPHORE_H_
12
13 #include <config.h>
14 #ifdef HAVE_SEMAPHORE_H
15 #include <semaphore.h>
16 #endif
17
18 #if defined (HAVE_SEMAPHORE_H) || defined (USE_MACH_SEMA)
19 #  define MONO_HAS_SEMAPHORES
20
21 #  if defined (USE_MACH_SEMA)
22 #    include <mach/mach_init.h>
23 #    include <mach/task.h>
24 #    include <mach/semaphore.h>
25 typedef semaphore_t MonoSemType;
26 #    define MONO_SEM_INIT(addr,value) semaphore_create (current_task (), (addr), SYNC_POLICY_FIFO, (value))
27 #    define MONO_SEM_WAIT(sem) semaphore_wait (*(sem))
28 #    define MONO_SEM_POST(sem) semaphore_signal (*(sem))
29 #    define MONO_SEM_DESTROY(sem) semaphore_destroy (current_task (), *(sem))
30 #  else
31 typedef sem_t MonoSemType;
32 #    define MONO_SEM_INIT(addr,value) sem_init ((addr), 0, (value))
33 #    define MONO_SEM_WAIT(sem) sem_wait ((sem))
34 #    define MONO_SEM_POST(sem) sem_post ((sem))
35 #    define MONO_SEM_DESTROY(sem) sem_destroy ((sem))
36 #  endif
37 #elif defined(PLATFORM_WIN32)
38 #  define MONO_HAS_SEMAPHORES
39 typedef HANDLE MonoSemType;
40 #    define MONO_SEM_INIT(addr,value) do {*(addr) = CreateSemaphore( NULL, (value), 10, NULL);} while(0)
41 #    define MONO_SEM_WAIT(sem) WaitForSingleObject ((sem), INFINITE)
42 #    define MONO_SEM_POST(sem) ReleaseSemaphore ((sem), 1, NULL)
43 #    define MONO_SEM_DESTROY(sem) CloseHandle ((sem))
44 #endif
45
46 #endif /* _MONO_SEMAPHORE_H_ */