summaryrefslogtreecommitdiffstats
path: root/common/threads.c
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2014-05-26 03:52:55 -0700
committerChris Robinson <[email protected]>2014-05-26 03:52:55 -0700
commitb6e1042e8c641a86b57b616497d2128cfbedbe54 (patch)
tree82e2ab8a1ad67630217f05a79aec3e689feea579 /common/threads.c
parentfd5e7f1466267a66ef17a03698d1e3b1323cb73d (diff)
Implement condition variables (POSIX only!)
Windows requires Vista or newer to get the CONDITION_VARIABNLE API, but we currently only require XP.
Diffstat (limited to 'common/threads.c')
-rw-r--r--common/threads.c48
1 files changed, 44 insertions, 4 deletions
diff --git a/common/threads.c b/common/threads.c
index d45efc91..b2db1682 100644
--- a/common/threads.c
+++ b/common/threads.c
@@ -170,7 +170,8 @@ int althrd_join(althrd_t thr, int *res)
GetExitCodeThread(hdl, &code);
CloseHandle(hdl);
- *res = (int)code;
+ if(res != NULL)
+ *res = (int)code;
return althrd_success;
}
@@ -412,11 +413,10 @@ int althrd_join(althrd_t thr, int *res)
{
void *code;
- if(!res) return althrd_error;
-
if(pthread_join(thr, &code) != 0)
return althrd_error;
- *res = (int)(intptr_t)code;
+ if(res != NULL)
+ *res = (int)(intptr_t)code;
return althrd_success;
}
@@ -495,6 +495,46 @@ int almtx_timedlock(almtx_t *mtx, const struct timespec *ts)
#endif
}
+int alcnd_init(alcnd_t *cond)
+{
+ if(pthread_cond_init(cond, NULL) == 0)
+ return althrd_success;
+ return althrd_error;
+}
+
+int alcnd_signal(alcnd_t *cond)
+{
+ if(pthread_cond_signal(cond) == 0)
+ return althrd_success;
+ return althrd_error;
+}
+
+int alcnd_broadcast(alcnd_t *cond)
+{
+ if(pthread_cond_broadcast(cond) == 0)
+ return althrd_success;
+ return althrd_error;
+}
+
+int alcnd_wait(alcnd_t *cond, almtx_t *mtx)
+{
+ if(pthread_cond_wait(cond, mtx) == 0)
+ return althrd_success;
+ return althrd_error;
+}
+
+int alcnd_timedwait(alcnd_t *cond, almtx_t *mtx, const struct timespec *time_point)
+{
+ if(pthread_cond_timedwait(cond, mtx, time_point) == 0)
+ return althrd_success;
+ return althrd_error;
+}
+
+void alcnd_destroy(alcnd_t *cond)
+{
+ pthread_cond_destroy(cond);
+}
+
int altss_create(altss_t *tss_id, altss_dtor_t callback)
{