diff options
author | dchagin <dchagin@FreeBSD.org> | 2014-12-13 21:00:10 +0000 |
---|---|---|
committer | dchagin <dchagin@FreeBSD.org> | 2014-12-13 21:00:10 +0000 |
commit | 6f2b57128c8cdb88f2777eed3c99e866c3c53e04 (patch) | |
tree | 953adb99f01e8d4c4fb2634bbc85b752a2c305b1 /sys/kern/kern_rmlock.c | |
parent | 7b50e3bb4b97cc0c655bf237c04e5caff51c5960 (diff) | |
download | FreeBSD-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.c | 12 |
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); } |