RW_HAS_WAITERS
next = rw_cas(ptr, owner, owner | RW_HAS_WAITERS);
owner | RW_HAS_WAITERS | RW_WRITE_WANTED);
if ((new & (RW_THREAD | RW_HAS_WAITERS)) != RW_HAS_WAITERS) {
if ((owner & RW_HAS_WAITERS) == 0) {
new |= RW_HAS_WAITERS | RW_WRITE_WANTED;
new |= RW_HAS_WAITERS;
set = RW_HAS_WAITERS | RW_WRITE_WANTED;
set = RW_HAS_WAITERS;
newval = (owner & ~(RW_HAS_WAITERS | RW_WRITE_WANTED)) | set;
__CTASSERT(RW_HAS_WAITERS == 1);
#if RW_HAS_WAITERS != 1
RW_ASSERT(rw, (o & RW_HAS_WAITERS) != 0);
if ((owner & (RW_WRITE_LOCKED|RW_HAS_WAITERS)) != RW_WRITE_LOCKED) {
set_wait = RW_HAS_WAITERS;
set_wait = RW_HAS_WAITERS | RW_WRITE_WANTED;
if ((newown & (RW_THREAD | RW_HAS_WAITERS)) == RW_HAS_WAITERS)
RW_ASSERT(rw, (owner & RW_HAS_WAITERS) != 0);
newown |= RW_WRITE_LOCKED | RW_HAS_WAITERS;
newown |= RW_HAS_WAITERS | RW_WRITE_WANTED;
if ((owner & RW_HAS_WAITERS) == 0) {
RW_ASSERT(rw, (rw->rw_owner & RW_HAS_WAITERS) != 0);
newown |= RW_READ_INCR | RW_HAS_WAITERS |
newown |= RW_HAS_WAITERS | RW_WRITE_WANTED;