summaryrefslogtreecommitdiff
path: root/sys/kern/kern_sx.c
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2017-02-19 16:28:46 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2017-02-19 16:28:46 +0000
commitb247fd395dc0d2f4f63e7a234c8df0fd28eebe02 (patch)
tree8c86f15d195ae934ca18e5850c9e630a44e4b154 /sys/kern/kern_sx.c
parent30545786bb310c0a754b406402d8a07de1fb7fae (diff)
downloadsrc-test2-b247fd395dc0d2f4f63e7a234c8df0fd28eebe02.tar.gz
src-test2-b247fd395dc0d2f4f63e7a234c8df0fd28eebe02.zip
Notes
Diffstat (limited to 'sys/kern/kern_sx.c')
-rw-r--r--sys/kern/kern_sx.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/sys/kern/kern_sx.c b/sys/kern/kern_sx.c
index d7f3f1348230..3236e03885dd 100644
--- a/sys/kern/kern_sx.c
+++ b/sys/kern/kern_sx.c
@@ -341,13 +341,18 @@ sx_try_xlock_(struct sx *sx, const char *file, int line)
rval = 1;
recursed = false;
x = SX_LOCK_UNLOCKED;
- if (!atomic_fcmpset_acq_ptr(&sx->sx_lock, &x, tid)) {
+ for (;;) {
+ if (atomic_fcmpset_acq_ptr(&sx->sx_lock, &x, tid))
+ break;
+ if (x == SX_LOCK_UNLOCKED)
+ continue;
if (x == tid && (sx->lock_object.lo_flags & LO_RECURSABLE)) {
sx->sx_recurse++;
atomic_set_ptr(&sx->sx_lock, SX_LOCK_RECURSED);
- } else {
- rval = 0;
+ break;
}
+ rval = 0;
+ break;
}
LOCK_LOG_TRY("XLOCK", &sx->lock_object, 0, rval, file, line);