summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThierry Bordaz <tbordaz@redhat.com>2016-04-26 12:44:56 +0300
committerAlexander Bokovoy <abokovoy@redhat.com>2016-05-30 13:59:23 +0300
commit5befd9e8618cd68e0dd5b7385c74d487ba0a0c8e (patch)
tree6970c09ae56f37ecec52bac67a8542ecbeb13840
parentdc18db811d26a9e376788688d4e68937b078ac58 (diff)
downloadslapi-nis-5befd9e8618cd68e0dd5b7385c74d487ba0a0c8e.tar.gz
slapi-nis-5befd9e8618cd68e0dd5b7385c74d487ba0a0c8e.tar.xz
slapi-nis-5befd9e8618cd68e0dd5b7385c74d487ba0a0c8e.zip
wrap: add wrapped mutex support
-rw-r--r--src/wrap.c90
-rw-r--r--src/wrap.h6
2 files changed, 96 insertions, 0 deletions
diff --git a/src/wrap.c b/src/wrap.c
index c89638f..f8056a4 100644
--- a/src/wrap.c
+++ b/src/wrap.c
@@ -79,6 +79,18 @@ struct wrapped_rwlock {
#endif
};
+struct wrapped_mutex {
+#if defined(USE_SLAPI_LOCKS)
+ Slapi_Mutex *mutex;
+#elif defined(USE_PTHREAD_LOCKS)
+ pthread_mutex_t mutex;
+#elif defined(USE_NSPR_LOCKS)
+ PRLock *mutex;
+#else
+#error "Unknown thread-safe locking model!"
+#endif
+};
+
#ifdef USE_NSPR_THREADS
static void
wrap_pthread_starter(void *p)
@@ -169,6 +181,84 @@ wrap_thread_stopfd(struct wrapped_thread *t)
return ret;
}
+struct wrapped_mutex *
+wrap_new_mutex(void)
+{
+ struct wrapped_mutex *mutex;
+ mutex = malloc(sizeof(*mutex));
+ if (mutex == NULL) {
+ return NULL;
+ }
+#ifdef USE_SLAPI_LOCKS
+ mutex->mutex = slapi_new_mutex();
+ if (mutex->mutex == NULL) {
+ free(mutex);
+ return NULL;
+ }
+#endif
+#ifdef USE_PTHREAD_LOCKS
+ if (pthread_mutex_init(&mutex->mutex, NULL) != 0) {
+ free(mutex);
+ return NULL;
+ }
+#endif
+#ifdef USE_NSPR_LOCKS
+ mutex->mutex = PR_NewLock();
+ if (mutex->mutex == NULL) {
+ free(mutex);
+ return NULL;
+ }
+#endif
+ return mutex;
+}
+
+void
+wrap_free_mutex(struct wrapped_mutex *mutex)
+{
+#ifdef USE_SLAPI_LOCKS
+ slapi_destroy_mutex(mutex->mutex);
+#endif
+#ifdef USE_PTHREAD_LOCKS
+ pthread_mutex_destroy(&mutex->mutex);
+#endif
+#ifdef USE_NSPR_LOCKS
+ PR_DestroyLock(mutex->mutex);
+#endif
+ free(mutex);
+}
+
+int
+wrap_mutex_lock(struct wrapped_mutex *mutex)
+{
+#ifdef USE_SLAPI_LOCKS
+ slapi_lock_mutex(mutex->mutex);
+ return 0;
+#endif
+#ifdef USE_PTHREAD_LOCKS
+ return pthread_mutex_lock(&mutex->mutex);
+#endif
+#ifdef USE_NSPR_LOCKS
+ PR_Lock(mutex->mutex);
+ return 0;
+#endif
+}
+
+int
+wrap_mutex_unlock(struct wrapped_mutex *mutex)
+{
+#ifdef USE_SLAPI_LOCKS
+ return slapi_unlock_mutex(mutex->mutex);
+#endif
+#ifdef USE_PTHREAD_LOCKS
+ return pthread_mutex_unlock(&mutex->mutex);
+#endif
+#ifdef USE_NSPR_LOCKS
+ PR_Unlock(mutex->mutex);
+ return 0;
+#endif
+}
+
+
struct wrapped_rwlock *
wrap_new_rwlock(void)
{
diff --git a/src/wrap.h b/src/wrap.h
index 71bd326..2b797f7 100644
--- a/src/wrap.h
+++ b/src/wrap.h
@@ -23,6 +23,7 @@
#define wrap_h
struct wrapped_thread;
+struct wrapped_mutex;
struct wrapped_rwlock;
struct wrapped_thread * wrap_start_thread(void * (*fn)(struct wrapped_thread *),
@@ -31,6 +32,11 @@ void *wrap_stop_thread(struct wrapped_thread *t);
void *wrap_thread_arg(struct wrapped_thread *t);
int wrap_thread_stopfd(struct wrapped_thread *t);
+struct wrapped_mutex *wrap_new_mutex(void);
+void wrap_free_mutex(struct wrapped_mutex *mutex);
+int wrap_mutex_lock(struct wrapped_mutex *mutex);
+int wrap_mutex_unlock(struct wrapped_mutex *mutex);
+
struct wrapped_rwlock *wrap_new_rwlock(void);
void wrap_free_rwlock(struct wrapped_rwlock *rwlock);
int wrap_rwlock_rdlock(struct wrapped_rwlock *rwlock);