Mercurial > almixer_isolated
comparison Isolated/SimpleMutex.c @ 38:71b465ff0622
Added support files.
author | Eric Wing <ewing@anscamobile.com> |
---|---|
date | Thu, 28 Apr 2011 16:22:30 -0700 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
37:b346b6608eab | 38:71b465ff0622 |
---|---|
1 #include "SimpleMutex.h" | |
2 #include <stdlib.h> | |
3 | |
4 #if defined(DEBUG) | |
5 #include <stdio.h> | |
6 #define MUTEXDBG(x) printf x | |
7 #else | |
8 #define MUTEXDBG(x) | |
9 #endif | |
10 | |
11 #if defined(_WIN32) && !defined(__CYGWIN32__) | |
12 #include <windows.h> | |
13 #include <winbase.h> /* For CreateMutex(), LockFile() */ | |
14 | |
15 struct SimpleMutex | |
16 { | |
17 HANDLE nativeMutex; | |
18 }; | |
19 | |
20 | |
21 SimpleMutex* SimpleMutex_CreateMutex() | |
22 { | |
23 SimpleMutex* simple_mutex = (SimpleMutex*)malloc(sizeof(SimpleMutex)); | |
24 if(NULL == simple_mutex) | |
25 { | |
26 MUTEXDBG(("Out of memory.\n")); | |
27 return NULL; | |
28 } | |
29 simple_mutex->nativeMutex = CreateMutex(NULL, FALSE, NULL); | |
30 if(NULL == simple_mutex->nativeMutex) | |
31 { | |
32 MUTEXDBG(("Out of memory.\n")); | |
33 free(simple_mutex); | |
34 return NULL; | |
35 } | |
36 return simple_mutex; | |
37 } | |
38 void SimpleMutex_DestroyMutex(SimpleMutex* simple_mutex) | |
39 { | |
40 if(NULL == simple_mutex) | |
41 { | |
42 return; | |
43 } | |
44 CloseHandle(simple_mutex->nativeMutex); | |
45 free(simple_mutex); | |
46 } | |
47 /* This will return true if locking is successful, false if not. | |
48 */ | |
49 int SimpleMutex_LockMutex(SimpleMutex* simple_mutex) | |
50 { | |
51 #ifdef DEBUG | |
52 if(NULL == simple_mutex) | |
53 { | |
54 MUTEXDBG(("SimpleMutex_LockMutex was passed NULL\n")); | |
55 return 0; | |
56 } | |
57 #endif | |
58 return( | |
59 WaitForSingleObject( | |
60 simple_mutex->nativeMutex, | |
61 INFINITE | |
62 ) != WAIT_FAILED | |
63 ); | |
64 } | |
65 void SimpleMutex_UnlockMutex(SimpleMutex* simple_mutex) | |
66 { | |
67 #ifdef DEBUG | |
68 if(NULL == simple_mutex) | |
69 { | |
70 MUTEXDBG(("SimpleMutex_UnlockMutex was passed NULL\n")); | |
71 return; | |
72 } | |
73 #endif | |
74 ReleaseMutex( | |
75 simple_mutex->nativeMutex | |
76 ); | |
77 } | |
78 #else /* Assuming POSIX...maybe not a good assumption. */ | |
79 #include <pthread.h> | |
80 | |
81 struct SimpleMutex | |
82 { | |
83 pthread_mutex_t* nativeMutex; | |
84 }; | |
85 | |
86 SimpleMutex* SimpleMutex_CreateMutex() | |
87 { | |
88 int ret_val; | |
89 SimpleMutex* simple_mutex = (SimpleMutex*)malloc(sizeof(SimpleMutex)); | |
90 if(NULL == simple_mutex) | |
91 { | |
92 MUTEXDBG(("Out of memory.\n")); | |
93 return NULL; | |
94 } | |
95 simple_mutex->nativeMutex = (pthread_mutex_t*)malloc(sizeof(pthread_mutex_t)); | |
96 if(NULL == simple_mutex->nativeMutex) | |
97 { | |
98 MUTEXDBG(("Out of memory.\n")); | |
99 free(simple_mutex); | |
100 return NULL; | |
101 } | |
102 | |
103 ret_val = pthread_mutex_init(simple_mutex->nativeMutex, NULL); | |
104 if(0 != ret_val) | |
105 { | |
106 free(simple_mutex->nativeMutex); | |
107 free(simple_mutex); | |
108 return NULL; | |
109 } | |
110 return simple_mutex; | |
111 } | |
112 void SimpleMutex_DestroyMutex(SimpleMutex* simple_mutex) | |
113 { | |
114 if(NULL != simple_mutex) | |
115 { | |
116 pthread_mutex_destroy(simple_mutex->nativeMutex); | |
117 free(simple_mutex->nativeMutex); | |
118 free(simple_mutex); | |
119 } | |
120 } | |
121 /* This will return true if locking is successful, false if not. | |
122 * (This is the opposite of pthread_mutex_lock which returns | |
123 * 0 for success.) | |
124 */ | |
125 int SimpleMutex_LockMutex(SimpleMutex* simple_mutex) | |
126 { | |
127 #ifdef DEBUG | |
128 if(NULL == simple_mutex) | |
129 { | |
130 MUTEXDBG(("SimpleMutex_LockMutex was passed NULL\n")); | |
131 return 0; | |
132 } | |
133 #endif | |
134 return( | |
135 pthread_mutex_lock( | |
136 simple_mutex->nativeMutex | |
137 ) == 0 | |
138 ); | |
139 } | |
140 void SimpleMutex_UnlockMutex(SimpleMutex* simple_mutex) | |
141 { | |
142 #ifdef DEBUG | |
143 if(NULL == simple_mutex) | |
144 { | |
145 MUTEXDBG(("SimpleMutex_LockMutex was passed NULL\n")); | |
146 return; | |
147 } | |
148 #endif | |
149 pthread_mutex_unlock( | |
150 simple_mutex->nativeMutex | |
151 ); | |
152 } | |
153 #endif | |
154 | |
155 |