summaryrefslogtreecommitdiffstats
path: root/src/thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/thread.c')
-rw-r--r--src/thread.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/thread.c b/src/thread.c
index eb535ab..796ea0b 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -67,6 +67,8 @@ int thread_join(THREAD_T thread)
67 67
68int thread_alive(THREAD_T thread) 68int thread_alive(THREAD_T thread)
69{ 69{
70 if (!thread)
71 return 0;
70#ifdef WIN32 72#ifdef WIN32
71 return WaitForSingleObject(thread, 0) == WAIT_TIMEOUT; 73 return WaitForSingleObject(thread, 0) == WAIT_TIMEOUT;
72#else 74#else
@@ -138,3 +140,76 @@ void thread_once(thread_once_t *once_control, void (*init_routine)(void))
138 pthread_once(once_control, init_routine); 140 pthread_once(once_control, init_routine);
139#endif 141#endif
140} 142}
143
144void cond_init(cond_t* cond)
145{
146#ifdef WIN32
147 cond->sem = CreateSemaphore(NULL, 0, 32767, NULL);
148#else
149 pthread_cond_init(cond, NULL);
150#endif
151}
152
153void cond_destroy(cond_t* cond)
154{
155#ifdef WIN32
156 CloseHandle(cond->sem);
157#else
158 pthread_cond_destroy(cond);
159#endif
160}
161
162int cond_signal(cond_t* cond)
163{
164#ifdef WIN32
165 int result = 0;
166 if (!ReleaseSemaphore(cond->sem, 1, NULL)) {
167 result = -1;
168 }
169 return result;
170#else
171 return pthread_cond_signal(cond);
172#endif
173}
174
175int cond_wait(cond_t* cond, mutex_t* mutex)
176{
177#ifdef WIN32
178 mutex_unlock(mutex);
179 DWORD res = WaitForSingleObject(cond->sem, INFINITE);
180 switch (res) {
181 case WAIT_OBJECT_0:
182 return 0;
183 default:
184 return -1;
185 }
186#else
187 return pthread_cond_wait(cond, mutex);
188#endif
189}
190
191int cond_wait_timeout(cond_t* cond, mutex_t* mutex, unsigned int timeout_ms)
192{
193#ifdef WIN32
194 mutex_unlock(mutex);
195 DWORD res = WaitForSingleObject(cond->sem, timeout_ms);
196 switch (res) {
197 case WAIT_OBJECT_0:
198 case WAIT_TIMEOUT:
199 return 0;
200 default:
201 return -1;
202 }
203#else
204 struct timespec ts;
205 struct timeval now;
206 gettimeofday(&now, NULL);
207
208 ts.tv_sec = now.tv_sec + timeout_ms / 1000;
209 ts.tv_nsec = now.tv_usec * 1000 + 1000 * 1000 * (timeout_ms % 1000);
210 ts.tv_sec += ts.tv_nsec / (1000 * 1000 * 1000);
211 ts.tv_nsec %= (1000 * 1000 * 1000);
212
213 return pthread_cond_timedwait(cond, mutex, &ts);
214#endif
215}