]> granicus.if.org Git - zfs/commitdiff
libspl: Implement LWP rwlock interface
authorRichard Yao <ryao@gentoo.org>
Wed, 30 Apr 2014 17:12:27 +0000 (13:12 -0400)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 1 May 2014 22:53:52 +0000 (15:53 -0700)
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 <ryao@gentoo.org>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #1970

include/sys/zfs_context.h
lib/libspl/include/synch.h

index 1861b845dded137b755c19b62a385c976b1aad37..ec2a7dea0ed715b7373e5c378bd4861e2e7f62de 100644 (file)
@@ -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>
index 7ce2a53d48ced84313bddd390c872b344e5096ab..93d2314986a424732bea30e5606cd1b9c86d5d34 100644 (file)
  */
 /*
  * 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