summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_rmlock.c
diff options
context:
space:
mode:
authordchagin <dchagin@FreeBSD.org>2014-12-13 21:00:10 +0000
committerdchagin <dchagin@FreeBSD.org>2014-12-13 21:00:10 +0000
commit6f2b57128c8cdb88f2777eed3c99e866c3c53e04 (patch)
tree953adb99f01e8d4c4fb2634bbc85b752a2c305b1 /sys/kern/kern_rmlock.c
parent7b50e3bb4b97cc0c655bf237c04e5caff51c5960 (diff)
downloadFreeBSD-src-6f2b57128c8cdb88f2777eed3c99e866c3c53e04.zip
FreeBSD-src-6f2b57128c8cdb88f2777eed3c99e866c3c53e04.tar.gz
Add _NEW flag to mtx(9), sx(9), rmlock(9) and rwlock(9).
A _NEW flag passed to _init_flags() to avoid check for double-init. Differential Revision: https://reviews.freebsd.org/D1208 Reviewed by: jhb, wblock MFC after: 1 Month
Diffstat (limited to 'sys/kern/kern_rmlock.c')
-rw-r--r--sys/kern/kern_rmlock.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/sys/kern/kern_rmlock.c b/sys/kern/kern_rmlock.c
index d93aa15..b5ea2af 100644
--- a/sys/kern/kern_rmlock.c
+++ b/sys/kern/kern_rmlock.c
@@ -277,22 +277,28 @@ void
rm_init_flags(struct rmlock *rm, const char *name, int opts)
{
struct lock_class *lc;
- int liflags;
+ int liflags, xflags;
liflags = 0;
if (!(opts & RM_NOWITNESS))
liflags |= LO_WITNESS;
if (opts & RM_RECURSE)
liflags |= LO_RECURSABLE;
+ if (opts & RM_NEW)
+ liflags |= LO_NEW;
rm->rm_writecpus = all_cpus;
LIST_INIT(&rm->rm_activeReaders);
if (opts & RM_SLEEPABLE) {
liflags |= LO_SLEEPABLE;
lc = &lock_class_rm_sleepable;
- sx_init_flags(&rm->rm_lock_sx, "rmlock_sx", SX_NOWITNESS);
+ xflags = (opts & RM_NEW ? SX_NEW : 0);
+ sx_init_flags(&rm->rm_lock_sx, "rmlock_sx",
+ xflags | SX_NOWITNESS);
} else {
lc = &lock_class_rm;
- mtx_init(&rm->rm_lock_mtx, name, "rmlock_mtx", MTX_NOWITNESS);
+ xflags = (opts & RM_NEW ? MTX_NEW : 0);
+ mtx_init(&rm->rm_lock_mtx, name, "rmlock_mtx",
+ xflags | MTX_NOWITNESS);
}
lock_init(&rm->lock_object, lc, name, NULL, liflags);
}
OpenPOWER on IntegriCloud