summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2008-03-16 17:10:52 +0000
committerpjd <pjd@FreeBSD.org>2008-03-16 17:10:52 +0000
commit6a68218ce149461bb488264f5f28b9dde97cab3e (patch)
treeaea083ce583d692f2c9016cb44b76d1450b9ea7e
parent3505d672cf544387219307afe160564d611ecce4 (diff)
downloadFreeBSD-src-6a68218ce149461bb488264f5f28b9dde97cab3e.zip
FreeBSD-src-6a68218ce149461bb488264f5f28b9dde97cab3e.tar.gz
Implement soon-to-be-used rw_unlock() macro.
-rw-r--r--share/man/man9/rwlock.910
-rw-r--r--sys/sys/rwlock.h6
2 files changed, 15 insertions, 1 deletions
diff --git a/share/man/man9/rwlock.9 b/share/man/man9/rwlock.9
index 94e53a1..4bc8312 100644
--- a/share/man/man9/rwlock.9
+++ b/share/man/man9/rwlock.9
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd November 25, 2007
+.Dd March 16, 2008
.Dt RWLOCK 9
.Os
.Sh NAME
@@ -36,6 +36,7 @@
.Nm rw_wlock ,
.Nm rw_runlock ,
.Nm rw_wunlock ,
+.Nm rw_unlock ,
.Nm rw_try_upgrade ,
.Nm rw_downgrade ,
.Nm rw_sleep ,
@@ -62,6 +63,8 @@
.Fn rw_runlock "struct rwlock *rw"
.Ft void
.Fn rw_wunlock "struct rwlock *rw"
+.Ft void
+.Fn rw_unlock "struct rwlock *rw"
.Ft int
.Fn rw_try_upgrade "struct rwlock *rw"
.Ft void
@@ -179,6 +182,11 @@ This function releases a shared lock previously acquired by
.It Fn rw_wunlock "struct rwlock *rw"
This function releases an exclusive lock previously acquired by
.Fn rw_wlock .
+.It Fn rw_unlock "struct rwlock *rw"
+This function releases a shared lock previously acquired by
+.Fn rw_rlock
+or an exclusive lock previously acquired by
+.Fn rw_wlock .
.It Fn rw_try_upgrade "struct rwlock *rw"
Attempt to upgrade a single shared lock to an exclusive lock.
The current thread must hold a shared lock of
diff --git a/sys/sys/rwlock.h b/sys/sys/rwlock.h
index fe7127b..d793e34 100644
--- a/sys/sys/rwlock.h
+++ b/sys/sys/rwlock.h
@@ -167,6 +167,12 @@ void _rw_assert(struct rwlock *rw, int what, const char *file, int line);
#define rw_runlock(rw) _rw_runlock((rw), LOCK_FILE, LOCK_LINE)
#define rw_try_upgrade(rw) _rw_try_upgrade((rw), LOCK_FILE, LOCK_LINE)
#define rw_downgrade(rw) _rw_downgrade((rw), LOCK_FILE, LOCK_LINE)
+#define rw_unlock(rw) do { \
+ if (rw_wowned(rw)) \
+ rw_wunlock(rw); \
+ else \
+ rw_runlock(rw); \
+} while (0)
#define rw_sleep(chan, rw, pri, wmesg, timo) \
_sleep((chan), &(rw)->lock_object, (pri), (wmesg), (timo))
OpenPOWER on IntegriCloud