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