RW_WRITE_LOCKED
if ((owner & ~RW_THREAD) != RW_WRITE_LOCKED)
if ((owner & (RW_WRITE_LOCKED | RW_WRITE_WANTED)) == 0) {
if ((owner & (RW_WRITE_LOCKED | RW_WRITE_WANTED)) != 0)
(uintptr_t)self | RW_WRITE_LOCKED);
next = rw_cas(ptr, owner, (uintptr_t)self | RW_WRITE_LOCKED);
if ((owner & RW_WRITE_LOCKED) != 0) {
decr = (uintptr_t)self | RW_WRITE_LOCKED;
new = (uintptr_t)thread | RW_WRITE_LOCKED;
if ((owner & RW_WRITE_LOCKED) != 0)
return (owner & RW_THREAD) != 0 && (owner & RW_WRITE_LOCKED) == 0;
return (owner & (RW_THREAD | RW_WRITE_LOCKED)) ==
((uintptr_t)pthread__self() | RW_WRITE_LOCKED);
if (owner & RW_WRITE_LOCKED)
if ((owner & (RW_WRITE_LOCKED|RW_HAS_WAITERS)) != RW_WRITE_LOCKED) {
need_wait = RW_WRITE_LOCKED | RW_WRITE_WANTED;
incr = curthread | RW_WRITE_LOCKED;
need_wait = RW_WRITE_LOCKED | RW_THREAD;
if (__predict_false((owner & RW_WRITE_LOCKED) != 0)) {
decr = curthread | RW_WRITE_LOCKED;
newown |= RW_WRITE_LOCKED | RW_HAS_WAITERS;
need_wait = RW_WRITE_LOCKED | RW_WRITE_WANTED;
incr = curthread | RW_WRITE_LOCKED;
need_wait = RW_WRITE_LOCKED | RW_THREAD;
RW_ASSERT(rw, (rw->rw_owner & RW_WRITE_LOCKED) != 0);
(rw->rw_owner & RW_WRITE_LOCKED) == 0);
RW_ASSERT(rw, (rw->rw_owner & RW_WRITE_LOCKED) == 0);
newown = curthread | RW_WRITE_LOCKED | (owner & ~RW_THREAD);
RW_ASSERT(rw, (next & RW_WRITE_LOCKED) == 0);
RW_ASSERT(rw, rw->rw_owner & RW_WRITE_LOCKED);
return (owner & RW_WRITE_LOCKED) == 0 && (owner & RW_THREAD) != 0;
return (rw->rw_owner & (RW_WRITE_LOCKED | RW_THREAD)) ==
(RW_WRITE_LOCKED | (uintptr_t)curlwp);
return (rw->rw_owner & RW_WRITE_LOCKED) != 0 ? RW_WRITER : RW_READER;
if ((owner & RW_WRITE_LOCKED) == 0)