diff options
author | Alexander Kabaev <kan@FreeBSD.org> | 2004-08-27 01:41:28 +0000 |
---|---|---|
committer | Alexander Kabaev <kan@FreeBSD.org> | 2004-08-27 01:41:28 +0000 |
commit | 4cef6d5a53a133cc980fb1ea9b8fd86838f95967 (patch) | |
tree | a69bdacb74e4776123dd43959b1951de65ae2083 /sys/kern/kern_lock.c | |
parent | 0ca311f6a1ef91d92b4ffe77cca58b2106b60f7c (diff) | |
download | src-4cef6d5a53a133cc980fb1ea9b8fd86838f95967.tar.gz src-4cef6d5a53a133cc980fb1ea9b8fd86838f95967.zip |
Reintroduce slightly modified patch from kern/69964. Check for
LK_HAVE_EXL in both acquire invocations.
MFC after: 5 days
Notes
Notes:
svn path=/head/; revision=134365
Diffstat (limited to 'sys/kern/kern_lock.c')
-rw-r--r-- | sys/kern/kern_lock.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/sys/kern/kern_lock.c b/sys/kern/kern_lock.c index c819ba186111..39822ea3f158 100644 --- a/sys/kern/kern_lock.c +++ b/sys/kern/kern_lock.c @@ -335,8 +335,12 @@ debuglockmgr(lkp, flags, interlkp, td, name, file, line) error = acquire(&lkp, extflags, LK_SHARE_NONZERO); lkp->lk_flags &= ~LK_WANT_UPGRADE; - if (error) - break; + if (error) { + if ((lkp->lk_flags & ( LK_WANT_EXCL | LK_WAIT_NONZERO)) == (LK_WANT_EXCL | LK_WAIT_NONZERO)) + wakeup((void *)lkp); + break; + } + lkp->lk_flags |= LK_HAVE_EXCL; lkp->lk_lockholder = thr; if (lkp->lk_exclusivecount != 0) @@ -389,10 +393,13 @@ debuglockmgr(lkp, flags, interlkp, td, name, file, line) /* * Wait for shared locks and upgrades to finish. */ - error = acquire(&lkp, extflags, LK_WANT_UPGRADE | LK_SHARE_NONZERO); + error = acquire(&lkp, extflags, LK_HAVE_EXCL | LK_WANT_UPGRADE | LK_SHARE_NONZERO); lkp->lk_flags &= ~LK_WANT_EXCL; - if (error) + if (error) { + if (lkp->lk_flags & LK_WAIT_NONZERO) + wakeup((void *)lkp); break; + } lkp->lk_flags |= LK_HAVE_EXCL; lkp->lk_lockholder = thr; if (lkp->lk_exclusivecount != 0) |