diff --git a/lib/include/chiaki/thread.h b/lib/include/chiaki/thread.h index dfd082f..d2a104e 100644 --- a/lib/include/chiaki/thread.h +++ b/lib/include/chiaki/thread.h @@ -48,6 +48,19 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_mutex_lock(ChiakiMutex *mutex); CHIAKI_EXPORT ChiakiErrorCode chiaki_mutex_trylock(ChiakiMutex *mutex); CHIAKI_EXPORT ChiakiErrorCode chiaki_mutex_unlock(ChiakiMutex *mutex); + +typedef struct chiaki_cond_t +{ + pthread_cond_t cond; +} ChiakiCond; + +CHIAKI_EXPORT ChiakiErrorCode chiaki_cond_init(ChiakiCond *cond); +CHIAKI_EXPORT ChiakiErrorCode chiaki_cond_fini(ChiakiCond *cond); +CHIAKI_EXPORT ChiakiErrorCode chiaki_cond_wait(ChiakiCond *cond, ChiakiMutex *mutex); +CHIAKI_EXPORT ChiakiErrorCode chiaki_cond_signal(ChiakiCond *cond); +CHIAKI_EXPORT ChiakiErrorCode chiaki_cond_broadcast(ChiakiCond *cond); + + #ifdef __cplusplus } #endif diff --git a/lib/src/thread.c b/lib/src/thread.c index 500f8a3..c066738 100644 --- a/lib/src/thread.c +++ b/lib/src/thread.c @@ -79,4 +79,49 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_mutex_unlock(ChiakiMutex *mutex) if(r != 0) return CHIAKI_ERR_UNKNOWN; return CHIAKI_ERR_SUCCESS; -} \ No newline at end of file +} + + + + +CHIAKI_EXPORT ChiakiErrorCode chiaki_cond_init(ChiakiCond *cond) +{ + int r = pthread_cond_init(&cond->cond, NULL); + if(r != 0) + return CHIAKI_ERR_UNKNOWN; + return CHIAKI_ERR_SUCCESS; +} + +CHIAKI_EXPORT ChiakiErrorCode chiaki_cond_fini(ChiakiCond *cond) +{ + int r = pthread_cond_destroy(&cond->cond); + if(r != 0) + return CHIAKI_ERR_UNKNOWN; + return CHIAKI_ERR_SUCCESS; +} + + + +CHIAKI_EXPORT ChiakiErrorCode chiaki_cond_wait(ChiakiCond *cond, ChiakiMutex *mutex) +{ + int r = pthread_cond_wait(&cond->cond, &mutex->mutex); + if(r != 0) + return CHIAKI_ERR_UNKNOWN; + return CHIAKI_ERR_SUCCESS; +} + +CHIAKI_EXPORT ChiakiErrorCode chiaki_cond_signal(ChiakiCond *cond) +{ + int r = pthread_cond_signal(&cond->cond); + if(r != 0) + return CHIAKI_ERR_UNKNOWN; + return CHIAKI_ERR_SUCCESS; +} + +CHIAKI_EXPORT ChiakiErrorCode chiaki_cond_broadcast(ChiakiCond *cond) +{ + int r = pthread_cond_broadcast(&cond->cond); + if(r != 0) + return CHIAKI_ERR_UNKNOWN; + return CHIAKI_ERR_SUCCESS; +}