RW_THREAD
if ((owner & ~RW_THREAD) != RW_WRITE_LOCKED)
thread = (pthread_t)(owner & RW_THREAD);
if ((owner & RW_THREAD) == (uintptr_t)self)
if ((owner & RW_THREAD) == 0) {
if ((owner & RW_THREAD) == (uintptr_t)self)
if ((owner & RW_THREAD) != (uintptr_t)self) {
if ((new & (RW_THREAD | RW_HAS_WAITERS)) != RW_HAS_WAITERS) {
if ((owner & RW_THREAD) == 0) {
return (owner & RW_THREAD) == (uintptr_t)pthread__self();
return (owner & RW_THREAD) != 0;
return (owner & RW_THREAD) != 0 && (owner & RW_WRITE_LOCKED) == 0;
return (owner & (RW_THREAD | RW_WRITE_LOCKED)) ==
return (struct lwp *)(owner & RW_THREAD);
l = (lwp_t *)(owner & RW_THREAD);
need_wait = RW_WRITE_LOCKED | RW_THREAD;
if (op == RW_READER || (rw->rw_owner & RW_THREAD) == curthread)
if ((newown & (RW_THREAD | RW_HAS_WAITERS)) == RW_HAS_WAITERS)
need_wait = RW_WRITE_LOCKED | RW_THREAD;
newown = curthread | RW_WRITE_LOCKED | (owner & ~RW_THREAD);
if (__predict_false((next & RW_THREAD) != RW_READ_INCR)) {
RW_ASSERT(rw, (next & RW_THREAD) != 0);
return (owner & RW_WRITE_LOCKED) == 0 && (owner & RW_THREAD) != 0;
return (rw->rw_owner & (RW_WRITE_LOCKED | RW_THREAD)) ==
return (rw->rw_owner & RW_THREAD) != 0;
return (void *)(owner & RW_THREAD);
#define RW_OWNER(rw) ((rw)->rw_owner & RW_THREAD)
#define RW_COUNT(rw) ((rw)->rw_owner & RW_THREAD)
#define RW_FLAGS(rw) ((rw)->rw_owner & ~RW_THREAD)