diff options
author | Mateusz Guzik <mjg@FreeBSD.org> | 2017-02-19 16:28:46 +0000 |
---|---|---|
committer | Mateusz Guzik <mjg@FreeBSD.org> | 2017-02-19 16:28:46 +0000 |
commit | b247fd395dc0d2f4f63e7a234c8df0fd28eebe02 (patch) | |
tree | 8c86f15d195ae934ca18e5850c9e630a44e4b154 /sys/kern/kern_sx.c | |
parent | 30545786bb310c0a754b406402d8a07de1fb7fae (diff) | |
download | src-test2-b247fd395dc0d2f4f63e7a234c8df0fd28eebe02.tar.gz src-test2-b247fd395dc0d2f4f63e7a234c8df0fd28eebe02.zip |
Notes
Diffstat (limited to 'sys/kern/kern_sx.c')
-rw-r--r-- | sys/kern/kern_sx.c | 11 |
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); |