SX_LOCK_UNLOCKED
#define rw_read_held(lock) ((lock)->sx_lock != SX_LOCK_UNLOCKED && ((lock)->sx_lock & SX_LOCK_SHARED))
setx = SX_LOCK_UNLOCKED;
if (sx->sx_lock == SX_LOCK_UNLOCKED ||
if (sx->sx_lock == SX_LOCK_UNLOCKED)
sx->sx_lock = SX_LOCK_UNLOCKED;
KASSERT(sx->sx_lock == SX_LOCK_UNLOCKED, ("sx lock still held"));
x = SX_LOCK_UNLOCKED;
x = SX_LOCK_UNLOCKED;
if (x == SX_LOCK_UNLOCKED)
while (x == SX_LOCK_UNLOCKED) {
if (__predict_false(x == SX_LOCK_UNLOCKED))
if (x == SX_LOCK_UNLOCKED) {
if (x == SX_LOCK_UNLOCKED) {
atomic_cmpset_rel_ptr(&sx->sx_lock, tid, SX_LOCK_UNLOCKED))
setx = SX_LOCK_UNLOCKED;
uintptr_t v = SX_LOCK_UNLOCKED;
!atomic_fcmpset_rel_ptr(&sx->sx_lock, &x, SX_LOCK_UNLOCKED)))