Implement condition variables (POSIX only!)
Windows requires Vista or newer to get the CONDITION_VARIABNLE API, but we currently only require XP.
This commit is contained in:
+44
-4
@@ -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)
|
||||
{
|
||||
|
||||
@@ -113,12 +113,23 @@ inline int altss_set(altss_t tss_id, void *val)
|
||||
|
||||
typedef pthread_t althrd_t;
|
||||
typedef pthread_mutex_t almtx_t;
|
||||
typedef pthread_cond_t alcnd_t;
|
||||
typedef pthread_key_t altss_t;
|
||||
typedef pthread_once_t alonce_flag;
|
||||
|
||||
#define AL_ONCE_FLAG_INIT PTHREAD_ONCE_INIT
|
||||
|
||||
|
||||
/* NOTE: Condition variables are POSIX-only at the moment, as Windows requires
|
||||
* Vista or newer for them (without slow, hacky work-arounds). */
|
||||
int alcnd_init(alcnd_t *cond);
|
||||
int alcnd_signal(alcnd_t *cond);
|
||||
int alcnd_broadcast(alcnd_t *cond);
|
||||
int alcnd_wait(alcnd_t *cond, almtx_t *mtx);
|
||||
int alcnd_timedwait(alcnd_t *cond, almtx_t *mtx, const struct timespec *time_point);
|
||||
void alcnd_destroy(alcnd_t *cond);
|
||||
|
||||
|
||||
inline althrd_t althrd_current(void)
|
||||
{
|
||||
return pthread_self();
|
||||
|
||||
Reference in New Issue
Block a user