Add ChiakiMutex

This commit is contained in:
Florian Märkl 2018-11-19 22:00:24 +01:00
commit f3e8164705
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
3 changed files with 59 additions and 1 deletions

View file

@ -34,7 +34,8 @@ typedef enum
CHIAKI_ERR_MEMORY, CHIAKI_ERR_MEMORY,
CHIAKI_ERR_NETWORK, CHIAKI_ERR_NETWORK,
CHIAKI_ERR_INVALID_DATA, CHIAKI_ERR_INVALID_DATA,
CHIAKI_ERR_BUF_TOO_SMALL CHIAKI_ERR_BUF_TOO_SMALL,
CHIAKI_ERR_MUTEX_LOCKED
} ChiakiErrorCode; } ChiakiErrorCode;
CHIAKI_EXPORT const char *chiaki_error_string(ChiakiErrorCode code); CHIAKI_EXPORT const char *chiaki_error_string(ChiakiErrorCode code);

View file

@ -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_create(ChiakiThread *thread, ChiakiThreadFunc func, void *arg);
CHIAKI_EXPORT ChiakiErrorCode chiaki_thread_join(ChiakiThread *thread, void **retval); 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 #ifdef __cplusplus
} }
#endif #endif

View file

@ -18,6 +18,7 @@
#include <chiaki/thread.h> #include <chiaki/thread.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
CHIAKI_EXPORT ChiakiErrorCode chiaki_thread_create(ChiakiThread *thread, ChiakiThreadFunc func, void *arg) 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) if(r != 0)
return CHIAKI_ERR_THREAD; return CHIAKI_ERR_THREAD;
return CHIAKI_ERR_SUCCESS; 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;
} }