6b9042
From 43ea9a5c6cf7f2022f1e586bb4514564fd7826cb Mon Sep 17 00:00:00 2001
6b9042
From: Thierry Bordaz <tbordaz@redhat.com>
6b9042
Date: Tue, 26 Apr 2016 12:44:56 +0300
6b9042
Subject: [PATCH 1/4] wrap: add wrapped mutex support
6b9042
6b9042
---
6b9042
 src/wrap.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6b9042
 src/wrap.h |  6 +++++
6b9042
 2 files changed, 96 insertions(+)
6b9042
6b9042
diff --git a/src/wrap.c b/src/wrap.c
6b9042
index c89638f..f8056a4 100644
6b9042
--- a/src/wrap.c
6b9042
+++ b/src/wrap.c
6b9042
@@ -79,6 +79,18 @@ struct wrapped_rwlock {
6b9042
 #endif
6b9042
 };
6b9042
 
6b9042
+struct wrapped_mutex {
6b9042
+#if defined(USE_SLAPI_LOCKS)
6b9042
+	Slapi_Mutex *mutex;
6b9042
+#elif defined(USE_PTHREAD_LOCKS)
6b9042
+	pthread_mutex_t mutex;
6b9042
+#elif defined(USE_NSPR_LOCKS)
6b9042
+	PRLock *mutex;
6b9042
+#else
6b9042
+#error "Unknown thread-safe locking model!"
6b9042
+#endif
6b9042
+};
6b9042
+
6b9042
 #ifdef USE_NSPR_THREADS
6b9042
 static void
6b9042
 wrap_pthread_starter(void *p)
6b9042
@@ -169,6 +181,84 @@ wrap_thread_stopfd(struct wrapped_thread *t)
6b9042
 	return ret;
6b9042
 }
6b9042
 
6b9042
+struct wrapped_mutex *
6b9042
+wrap_new_mutex(void)
6b9042
+{
6b9042
+	struct wrapped_mutex *mutex;
6b9042
+	mutex = malloc(sizeof(*mutex));
6b9042
+	if (mutex == NULL) {
6b9042
+		return NULL;
6b9042
+	}
6b9042
+#ifdef USE_SLAPI_LOCKS
6b9042
+	mutex->mutex = slapi_new_mutex();
6b9042
+	if (mutex->mutex == NULL) {
6b9042
+		free(mutex);
6b9042
+		return NULL;
6b9042
+	}
6b9042
+#endif
6b9042
+#ifdef USE_PTHREAD_LOCKS
6b9042
+	if (pthread_mutex_init(&mutex->mutex, NULL) != 0) {
6b9042
+		free(mutex);
6b9042
+		return NULL;
6b9042
+	}
6b9042
+#endif
6b9042
+#ifdef USE_NSPR_LOCKS
6b9042
+	mutex->mutex = PR_NewLock();
6b9042
+	if (mutex->mutex == NULL) {
6b9042
+		free(mutex);
6b9042
+		return NULL;
6b9042
+	}
6b9042
+#endif
6b9042
+	return mutex;
6b9042
+}
6b9042
+
6b9042
+void
6b9042
+wrap_free_mutex(struct wrapped_mutex *mutex)
6b9042
+{
6b9042
+#ifdef USE_SLAPI_LOCKS
6b9042
+	slapi_destroy_mutex(mutex->mutex);
6b9042
+#endif
6b9042
+#ifdef USE_PTHREAD_LOCKS
6b9042
+	pthread_mutex_destroy(&mutex->mutex);
6b9042
+#endif
6b9042
+#ifdef USE_NSPR_LOCKS
6b9042
+	PR_DestroyLock(mutex->mutex);
6b9042
+#endif
6b9042
+	free(mutex);
6b9042
+}
6b9042
+
6b9042
+int
6b9042
+wrap_mutex_lock(struct wrapped_mutex *mutex)
6b9042
+{
6b9042
+#ifdef USE_SLAPI_LOCKS
6b9042
+	slapi_lock_mutex(mutex->mutex);
6b9042
+        return 0;
6b9042
+#endif
6b9042
+#ifdef USE_PTHREAD_LOCKS
6b9042
+	return pthread_mutex_lock(&mutex->mutex);
6b9042
+#endif
6b9042
+#ifdef USE_NSPR_LOCKS
6b9042
+	PR_Lock(mutex->mutex);
6b9042
+	return 0;
6b9042
+#endif
6b9042
+}
6b9042
+
6b9042
+int
6b9042
+wrap_mutex_unlock(struct wrapped_mutex *mutex)
6b9042
+{
6b9042
+#ifdef USE_SLAPI_LOCKS
6b9042
+	return slapi_unlock_mutex(mutex->mutex);
6b9042
+#endif
6b9042
+#ifdef USE_PTHREAD_LOCKS
6b9042
+	return pthread_mutex_unlock(&mutex->mutex);
6b9042
+#endif
6b9042
+#ifdef USE_NSPR_LOCKS
6b9042
+	PR_Unlock(mutex->mutex);
6b9042
+	return 0;
6b9042
+#endif
6b9042
+}
6b9042
+
6b9042
+
6b9042
 struct wrapped_rwlock *
6b9042
 wrap_new_rwlock(void)
6b9042
 {
6b9042
diff --git a/src/wrap.h b/src/wrap.h
6b9042
index 71bd326..2b797f7 100644
6b9042
--- a/src/wrap.h
6b9042
+++ b/src/wrap.h
6b9042
@@ -23,6 +23,7 @@
6b9042
 #define wrap_h
6b9042
 
6b9042
 struct wrapped_thread;
6b9042
+struct wrapped_mutex;
6b9042
 struct wrapped_rwlock;
6b9042
 
6b9042
 struct wrapped_thread * wrap_start_thread(void * (*fn)(struct wrapped_thread *),
6b9042
@@ -31,6 +32,11 @@ void *wrap_stop_thread(struct wrapped_thread *t);
6b9042
 void *wrap_thread_arg(struct wrapped_thread *t);
6b9042
 int wrap_thread_stopfd(struct wrapped_thread *t);
6b9042
 
6b9042
+struct wrapped_mutex *wrap_new_mutex(void);
6b9042
+void wrap_free_mutex(struct wrapped_mutex *mutex);
6b9042
+int wrap_mutex_lock(struct wrapped_mutex *mutex);
6b9042
+int wrap_mutex_unlock(struct wrapped_mutex *mutex);
6b9042
+
6b9042
 struct wrapped_rwlock *wrap_new_rwlock(void);
6b9042
 void wrap_free_rwlock(struct wrapped_rwlock *rwlock);
6b9042
 int wrap_rwlock_rdlock(struct wrapped_rwlock *rwlock);
6b9042
-- 
6b9042
2.7.4
6b9042