diff options
author | Richard Yao <[email protected]> | 2014-04-30 13:12:27 -0400 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2014-05-01 15:53:52 -0700 |
commit | 3af3df905fb43dd3a3957f3daea7777a434fee05 (patch) | |
tree | ba965a8976b5a742ea9da39c92b962275f8ad9f7 | |
parent | c6e924fea8fd2abc1359ad08e51bf326cbeb3ed4 (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.h | 1 | ||||
-rw-r--r-- | lib/libspl/include/synch.h | 51 |
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 |