#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); }