From f3e81647051d9d6e744e431574935ac65318f4f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=A4rkl?= Date: Mon, 19 Nov 2018 22:00:24 +0100 Subject: [PATCH] Add ChiakiMutex --- lib/include/chiaki/common.h | 3 ++- lib/include/chiaki/thread.h | 12 ++++++++++ lib/src/thread.c | 45 +++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/lib/include/chiaki/common.h b/lib/include/chiaki/common.h index 071f42c..0e6d444 100644 --- a/lib/include/chiaki/common.h +++ b/lib/include/chiaki/common.h @@ -34,7 +34,8 @@ typedef enum CHIAKI_ERR_MEMORY, CHIAKI_ERR_NETWORK, CHIAKI_ERR_INVALID_DATA, - CHIAKI_ERR_BUF_TOO_SMALL + CHIAKI_ERR_BUF_TOO_SMALL, + CHIAKI_ERR_MUTEX_LOCKED } ChiakiErrorCode; CHIAKI_EXPORT const char *chiaki_error_string(ChiakiErrorCode code); diff --git a/lib/include/chiaki/thread.h b/lib/include/chiaki/thread.h index 3ba8bb3..dfd082f 100644 --- a/lib/include/chiaki/thread.h +++ b/lib/include/chiaki/thread.h @@ -36,6 +36,18 @@ typedef void *(*ChiakiThreadFunc)(void *); CHIAKI_EXPORT ChiakiErrorCode chiaki_thread_create(ChiakiThread *thread, ChiakiThreadFunc func, void *arg); CHIAKI_EXPORT ChiakiErrorCode chiaki_thread_join(ChiakiThread *thread, void **retval); + +typedef struct chiaki_mutex_t +{ + pthread_mutex_t mutex; +} ChiakiMutex; + +CHIAKI_EXPORT ChiakiErrorCode chiaki_mutex_init(ChiakiMutex *mutex); +CHIAKI_EXPORT ChiakiErrorCode chiaki_mutex_fini(ChiakiMutex *mutex); +CHIAKI_EXPORT ChiakiErrorCode chiaki_mutex_lock(ChiakiMutex *mutex); +CHIAKI_EXPORT ChiakiErrorCode chiaki_mutex_trylock(ChiakiMutex *mutex); +CHIAKI_EXPORT ChiakiErrorCode chiaki_mutex_unlock(ChiakiMutex *mutex); + #ifdef __cplusplus } #endif diff --git a/lib/src/thread.c b/lib/src/thread.c index a9f8873..500f8a3 100644 --- a/lib/src/thread.c +++ b/lib/src/thread.c @@ -18,6 +18,7 @@ #include #include +#include CHIAKI_EXPORT ChiakiErrorCode chiaki_thread_create(ChiakiThread *thread, ChiakiThreadFunc func, void *arg) @@ -34,4 +35,48 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_thread_join(ChiakiThread *thread, void **re if(r != 0) return CHIAKI_ERR_THREAD; return CHIAKI_ERR_SUCCESS; +} + + + +CHIAKI_EXPORT ChiakiErrorCode chiaki_mutex_init(ChiakiMutex *mutex) +{ + int r = pthread_mutex_init(&mutex->mutex, NULL); + if(r != 0) + return CHIAKI_ERR_UNKNOWN; + return CHIAKI_ERR_SUCCESS; +} + +CHIAKI_EXPORT ChiakiErrorCode chiaki_mutex_fini(ChiakiMutex *mutex) +{ + int r = pthread_mutex_destroy(&mutex->mutex); + if(r != 0) + return CHIAKI_ERR_UNKNOWN; + return CHIAKI_ERR_SUCCESS; +} + +CHIAKI_EXPORT ChiakiErrorCode chiaki_mutex_lock(ChiakiMutex *mutex) +{ + int r = pthread_mutex_lock(&mutex->mutex); + if(r != 0) + return CHIAKI_ERR_UNKNOWN; + return CHIAKI_ERR_SUCCESS; +} + +CHIAKI_EXPORT ChiakiErrorCode chiaki_mutex_trylock(ChiakiMutex *mutex) +{ + int r = pthread_mutex_trylock(&mutex->mutex); + if(r == EBUSY) + return CHIAKI_ERR_MUTEX_LOCKED; + else if(r != 0) + return CHIAKI_ERR_UNKNOWN; + return CHIAKI_ERR_SUCCESS; +} + +CHIAKI_EXPORT ChiakiErrorCode chiaki_mutex_unlock(ChiakiMutex *mutex) +{ + int r = pthread_mutex_unlock(&mutex->mutex); + if(r != 0) + return CHIAKI_ERR_UNKNOWN; + return CHIAKI_ERR_SUCCESS; } \ No newline at end of file