mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2025-04-06 17:49:11 +03:00
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 <ryao@gentoo.org> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Issue #1970
This commit is contained in:
parent
c6e924fea8
commit
3af3df905f
@ -90,6 +90,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
#include <synch.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <alloca.h>
|
#include <alloca.h>
|
||||||
#include <umem.h>
|
#include <umem.h>
|
||||||
|
@ -21,10 +21,61 @@
|
|||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
|
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
|
||||||
|
* Copyright 2014 Zettabyte Software, LLC. All rights reserved.
|
||||||
* Use is subject to license terms.
|
* Use is subject to license terms.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _LIBSPL_SYNCH_H
|
#ifndef _LIBSPL_SYNCH_H
|
||||||
#define _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
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user