runtime] Add semicolons after the calls to the coop gc macros to avoid confusing...
[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 #include <glib.h>
15 #include <time.h>
16 #if defined(HAVE_SEMAPHORE_H) && !defined(HOST_WIN32)
17 #include <semaphore.h>
18 #endif
19 #include <mono/io-layer/io-layer.h>
20 #include <mono/utils/mono-publib.h>
21
22 #if (defined (HAVE_SEMAPHORE_H) || defined (USE_MACH_SEMA)) && !defined(HOST_WIN32)
23 #  define MONO_HAS_SEMAPHORES
24
25 #  if defined (USE_MACH_SEMA)
26 #    include <mach/mach_init.h>
27 #    include <mach/task.h>
28 #    include <mach/semaphore.h>
29 typedef semaphore_t MonoSemType;
30 #    define MONO_SEM_INIT(addr,value) semaphore_create (current_task (), (addr), SYNC_POLICY_FIFO, (value))
31 #    define MONO_SEM_DESTROY(sem) semaphore_destroy (current_task (), *(sem))
32 #  else
33 typedef sem_t MonoSemType;
34 #    define MONO_SEM_INIT(addr,value) sem_init ((addr), 0, (value))
35 #    define MONO_SEM_DESTROY(sem) sem_destroy ((sem))
36 #  endif
37 #else
38 #  define MONO_HAS_SEMAPHORES
39 typedef HANDLE MonoSemType;
40 #    define MONO_SEM_INIT(addr,initial) do {*(addr) = CreateSemaphore ( NULL,(initial),0x7FFFFFFF,NULL);} while(0)
41 #    define MONO_SEM_DESTROY(sem) do { CloseHandle (*(sem)); (*(sem))=0; } while(0)
42 #endif
43
44 #define MONO_SEM_WAIT(sem) MONO_SEM_WAIT_ALERTABLE(sem, FALSE)
45 #define MONO_SEM_WAIT_ALERTABLE(sem,alertable) mono_sem_wait ((sem), alertable)
46 #define MONO_SEM_POST(sem) mono_sem_post ((sem))
47 #define MONO_SEM_TIMEDWAIT(sem, timeout_ms) MONO_SEM_TIMEDWAIT_ALERTABLE(sem, timeout_ms, FALSE)
48 #define MONO_SEM_TIMEDWAIT_ALERTABLE(sem, timeout_ms, alertable) mono_sem_timedwait ((sem), (timeout_ms), alertable) 
49
50 #define MONO_SEM_WAIT_UNITERRUPTIBLE(sem) do { \
51         while (MONO_SEM_WAIT ((sem)) != 0) {    \
52                 /*if (EINTR != errno) ABORT("sem_wait failed"); */      \
53         }       \
54 } while (0)
55
56 G_BEGIN_DECLS
57
58 MONO_API int mono_sem_wait (MonoSemType *sem, gboolean alertable);
59 MONO_API int mono_sem_timedwait (MonoSemType *sem, guint32 timeout_ms, gboolean alertable);
60 MONO_API int mono_sem_post (MonoSemType *sem);
61
62 G_END_DECLS
63 #endif /* _MONO_SEMAPHORE_H_ */