aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Yao <[email protected]>2014-04-30 13:12:27 -0400
committerBrian Behlendorf <[email protected]>2014-05-01 15:53:52 -0700
commit3af3df905fb43dd3a3957f3daea7777a434fee05 (patch)
treeba965a8976b5a742ea9da39c92b962275f8ad9f7
parentc6e924fea8fd2abc1359ad08e51bf326cbeb3ed4 (diff)
libspl: Implement LWP rwlock interface
This implements a subset of the LWP rwlock interface by wrapping the equivalent POSIX thread interface. It is a superset of the features needed by ztest. The missing bits are {,_}rw_read_held() and {,_}rw_write_held(). Signed-off-by: Richard Yao <[email protected]> Signed-off-by: Brian Behlendorf <[email protected]> Issue #1970
-rw-r--r--include/sys/zfs_context.h1
-rw-r--r--lib/libspl/include/synch.h51
2 files changed, 52 insertions, 0 deletions
diff --git a/include/sys/zfs_context.h b/include/sys/zfs_context.h
index 1861b845d..ec2a7dea0 100644
--- a/include/sys/zfs_context.h
+++ b/include/sys/zfs_context.h
@@ -90,6 +90,7 @@
#include <string.h>
#include <strings.h>
#include <pthread.h>
+#include <synch.h>
#include <assert.h>
#include <alloca.h>
#include <umem.h>
diff --git a/lib/libspl/include/synch.h b/lib/libspl/include/synch.h
index 7ce2a53d4..93d231498 100644
--- a/lib/libspl/include/synch.h
+++ b/lib/libspl/include/synch.h
@@ -21,10 +21,61 @@
*/
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2014 Zettabyte Software, LLC. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _LIBSPL_SYNCH_H
#define _LIBSPL_SYNCH_H
+#ifndef __sun__
+
+#include <assert.h>
+#include <pthread.h>
+
+/*
+ * Definitions of synchronization types.
+ */
+#define USYNC_THREAD 0x00 /* private to a process */
+#define USYNC_PROCESS 0x01 /* shared by processes */
+
+typedef pthread_rwlock_t rwlock_t;
+
+#define DEFAULTRWLOCK PTHREAD_RWLOCK_INITIALIZER
+
+static inline int
+rwlock_init(rwlock_t *rwlp, int type, void *arg)
+{
+ pthread_rwlockattr_t attr;
+ int err = 0;
+
+ VERIFY0(pthread_rwlockattr_init(&attr));
+ switch (type) {
+ case USYNC_THREAD:
+ VERIFY0(pthread_rwlockattr_setpshared(&attr,
+ PTHREAD_PROCESS_PRIVATE));
+ break;
+ case USYNC_PROCESS:
+ VERIFY0(pthread_rwlockattr_setpshared(&attr,
+ PTHREAD_PROCESS_SHARED));
+ break;
+ default:
+ VERIFY0(1);
+ }
+
+ err = pthread_rwlock_init(rwlp, &attr);
+ VERIFY0(pthread_rwlockattr_destroy(&attr));
+
+ return (err);
+}
+
+#define rwlock_destroy(x) pthread_rwlock_destroy((x))
+#define rw_rdlock(x) pthread_rwlock_rdlock((x))
+#define rw_wrlock(x) pthread_rwlock_wrlock((x))
+#define rw_unlock(x) pthread_rwlock_unlock((x))
+#define rw_tryrdlock(x) pthread_rwlock_tryrdlock((x))
+#define rw_trywrlock(x) pthread_rwlock_trywrlock((x))
+
+#endif /* __sun__ */
+
#endif