Merge pull request #3199 from lambdageek/dev/proxy-setter
[mono.git] / mono / utils / mono-coop-mutex.h
1
2 #ifndef __MONO_COOP_MUTEX_H__
3 #define __MONO_COOP_MUTEX_H__
4
5 #include <config.h>
6 #include <glib.h>
7
8 #include "mono-os-mutex.h"
9 #include "mono-threads-api.h"
10
11 G_BEGIN_DECLS
12
13 /* We put the OS sync primitives in struct, so the compiler will warn us if
14  * we use mono_os_(mutex|cond|sem)_... on MonoCoop(Mutex|Cond|Sem) structures */
15
16 typedef struct _MonoCoopMutex MonoCoopMutex;
17 struct _MonoCoopMutex {
18         mono_mutex_t m;
19 };
20
21 typedef struct _MonoCoopCond MonoCoopCond;
22 struct _MonoCoopCond {
23         mono_cond_t c;
24 };
25
26 static inline void
27 mono_coop_mutex_init (MonoCoopMutex *mutex)
28 {
29         mono_os_mutex_init (&mutex->m);
30 }
31
32 static inline void
33 mono_coop_mutex_init_recursive (MonoCoopMutex *mutex)
34 {
35         mono_os_mutex_init_recursive (&mutex->m);
36 }
37
38 static inline gint
39 mono_coop_mutex_destroy (MonoCoopMutex *mutex)
40 {
41         return mono_os_mutex_destroy (&mutex->m);
42 }
43
44 static inline void
45 mono_coop_mutex_lock (MonoCoopMutex *mutex)
46 {
47         /* Avoid thread state switch if lock is not contended */
48         if (mono_os_mutex_trylock (&mutex->m) == 0)
49                 return;
50
51         MONO_ENTER_GC_SAFE;
52
53         mono_os_mutex_lock (&mutex->m);
54
55         MONO_EXIT_GC_SAFE;
56 }
57
58 static inline gint
59 mono_coop_mutex_trylock (MonoCoopMutex *mutex)
60 {
61         return mono_os_mutex_trylock (&mutex->m);
62 }
63
64 static inline void
65 mono_coop_mutex_unlock (MonoCoopMutex *mutex)
66 {
67         mono_os_mutex_unlock (&mutex->m);
68 }
69
70 static inline void
71 mono_coop_cond_init (MonoCoopCond *cond)
72 {
73         mono_os_cond_init (&cond->c);
74 }
75
76 static inline gint
77 mono_coop_cond_destroy (MonoCoopCond *cond)
78 {
79         return mono_os_cond_destroy (&cond->c);
80 }
81
82 static inline void
83 mono_coop_cond_wait (MonoCoopCond *cond, MonoCoopMutex *mutex)
84 {
85         MONO_ENTER_GC_SAFE;
86
87         mono_os_cond_wait (&cond->c, &mutex->m);
88
89         MONO_EXIT_GC_SAFE;
90 }
91
92 static inline gint
93 mono_coop_cond_timedwait (MonoCoopCond *cond, MonoCoopMutex *mutex, guint32 timeout_ms)
94 {
95         gint res;
96
97         MONO_ENTER_GC_SAFE;
98
99         res = mono_os_cond_timedwait (&cond->c, &mutex->m, timeout_ms);
100
101         MONO_EXIT_GC_SAFE;
102
103         return res;
104 }
105
106 static inline void
107 mono_coop_cond_signal (MonoCoopCond *cond)
108 {
109         mono_os_cond_signal (&cond->c);
110 }
111
112 static inline void
113 mono_coop_cond_broadcast (MonoCoopCond *cond)
114 {
115         mono_os_cond_broadcast (&cond->c);
116 }
117
118 G_END_DECLS
119
120 #endif /* __MONO_COOP_MUTEX_H__ */