Merge pull request #2338 from BogdanovKirill/httpwritefix3
[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.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 gint
27 mono_coop_mutex_init (MonoCoopMutex *mutex)
28 {
29         return mono_os_mutex_init (&mutex->m);
30 }
31
32 static inline gint
33 mono_coop_mutex_init_recursive (MonoCoopMutex *mutex)
34 {
35         return 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 gint
45 mono_coop_mutex_lock (MonoCoopMutex *mutex)
46 {
47         gint res;
48
49         /* Avoid thread state switch if lock is not contended */
50         if (mono_os_mutex_trylock (&mutex->m) == 0)
51                 return 0;
52
53         MONO_PREPARE_BLOCKING;
54
55         res = mono_os_mutex_lock (&mutex->m);
56
57         MONO_FINISH_BLOCKING;
58
59         return res;
60 }
61
62 static inline gint
63 mono_coop_mutex_trylock (MonoCoopMutex *mutex)
64 {
65         return mono_os_mutex_trylock (&mutex->m);
66 }
67
68 static inline gint
69 mono_coop_mutex_unlock (MonoCoopMutex *mutex)
70 {
71         return mono_os_mutex_unlock (&mutex->m);
72 }
73
74 static inline gint
75 mono_coop_cond_init (MonoCoopCond *cond)
76 {
77         return mono_os_cond_init (&cond->c);
78 }
79
80 static inline gint
81 mono_coop_cond_destroy (MonoCoopCond *cond)
82 {
83         return mono_os_cond_destroy (&cond->c);
84 }
85
86 static inline gint
87 mono_coop_cond_wait (MonoCoopCond *cond, MonoCoopMutex *mutex)
88 {
89         gint res;
90
91         MONO_PREPARE_BLOCKING;
92
93         res = mono_os_cond_wait (&cond->c, &mutex->m);
94
95         MONO_FINISH_BLOCKING;
96
97         return res;
98 }
99
100 static inline gint
101 mono_coop_cond_timedwait (MonoCoopCond *cond, MonoCoopMutex *mutex, guint32 timeout_ms)
102 {
103         gint res;
104
105         MONO_PREPARE_BLOCKING;
106
107         res = mono_os_cond_timedwait (&cond->c, &mutex->m, timeout_ms);
108
109         MONO_FINISH_BLOCKING;
110
111         return res;
112 }
113
114 static inline gint
115 mono_coop_cond_signal (MonoCoopCond *cond)
116 {
117         return mono_os_cond_signal (&cond->c);
118 }
119
120 static inline gint
121 mono_coop_cond_broadcast (MonoCoopCond *cond)
122 {
123         return mono_os_cond_broadcast (&cond->c);
124 }
125
126 G_END_DECLS
127
128 #endif /* __MONO_COOP_MUTEX_H__ */