Blob Blame History Raw
From 43ea9a5c6cf7f2022f1e586bb4514564fd7826cb Mon Sep 17 00:00:00 2001
From: Thierry Bordaz <tbordaz@redhat.com>
Date: Tue, 26 Apr 2016 12:44:56 +0300
Subject: [PATCH 1/4] wrap: add wrapped mutex support

---
 src/wrap.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/wrap.h |  6 +++++
 2 files changed, 96 insertions(+)

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);
-- 
2.7.4