From bef6322859a5dc01e35d884de7afd2eabb1d9e4d Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 17 May 2007 22:22:53 +0000 Subject: at basic locking/threading support git-svn-id: file:///home/lennart/svn/public/libsydney/trunk@26 9ba3c220-e4d3-45a2-8aa3-73fcc9aff6ce --- mutex.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 mutex.c (limited to 'mutex.c') diff --git a/mutex.c b/mutex.c new file mode 100644 index 0000000..8674fff --- /dev/null +++ b/mutex.c @@ -0,0 +1,86 @@ +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "macro.h" +#include "malloc.h" +#include "mutex.h" + +struct sa_mutex { + pthread_mutex_t mutex; +}; + +struct sa_cond { + pthread_cond_t cond; +}; + +sa_mutex_t* sa_mutex_new(int recursive) { + sa_mutex_t *m; + pthread_mutexattr_t attr; + + pthread_mutexattr_init(&attr); + + if (recursive) + sa_assert_success(pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE)); + + if (!(m = sa_new(sa_mutex_t, 1))) + return NULL; + + sa_assert_success(pthread_mutex_init(&m->mutex, &attr)); + return m; +} + +void sa_mutex_free(sa_mutex_t *m) { + assert(m); + + sa_assert_success(pthread_mutex_destroy(&m->mutex)); + sa_free(m); +} + +void sa_mutex_lock(sa_mutex_t *m) { + assert(m); + + sa_assert_success(pthread_mutex_lock(&m->mutex)); +} + +void sa_mutex_unlock(sa_mutex_t *m) { + assert(m); + + sa_assert_success(pthread_mutex_unlock(&m->mutex)); +} + +sa_cond_t *sa_cond_new(void) { + sa_cond_t *c; + + if (!(c = sa_new(sa_cond_t, 1))) + return NULL; + + sa_assert_success(pthread_cond_init(&c->cond, NULL)); + return c; +} + +void sa_cond_free(sa_cond_t *c) { + assert(c); + + sa_assert_success(pthread_cond_destroy(&c->cond)); + sa_free(c); +} + +void sa_cond_signal(sa_cond_t *c, int broadcast) { + assert(c); + + if (broadcast) + sa_assert_success(pthread_cond_broadcast(&c->cond)); + else + sa_assert_success(pthread_cond_signal(&c->cond)); +} + +int sa_cond_wait(sa_cond_t *c, sa_mutex_t *m) { + assert(c); + assert(m); + + return pthread_cond_wait(&c->cond, &m->mutex); +} -- cgit