From 3af3df905fb43dd3a3957f3daea7777a434fee05 Mon Sep 17 00:00:00 2001 From: Richard Yao Date: Wed, 30 Apr 2014 13:12:27 -0400 Subject: 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 Signed-off-by: Brian Behlendorf Issue #1970 --- include/sys/zfs_context.h | 1 + lib/libspl/include/synch.h | 51 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) 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 #include #include +#include #include #include #include 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 +#include + +/* + * 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 -- cgit v1.2.3