void ReadWriteLock_ReleaseWrite( _Inout_ ReadWriteLock* self) { volatile LockFields* lock = (LockFields*)self; size_t state, key; state = Atomic_Add(LockState(lock), -OWN_EXCLUSIVE); if (state != 0) { /* There is a queue. * Threads may be blocked waiting for us to leave. */ key = (size_t)lock ^ LockExit(state); CondLock_Broadcast(key); //if (((LockEntry(state) - LockExit(state)) & (FIELD_SIZE - 1)) == 2 && if (LockEntry(state) - LockExit(state) >= 2 && ((CurrentTick() - LockUnfair(state)) & 14) == 0) { /* Under certain conditions, encourage the last group of threads in * line to stop spinning and acquire unfairly. */ if (LockEntry(state) == LockWriter(state)) key = (size_t)lock ^ (LockEntry(state) - 1); else key = (size_t)lock ^ LockWriter(state); CondLock_BroadcastSpinners(key); } } }
void CachedLock_ReleaseWrite( _Inout_ CachedLock* self ) { ReadWriteLock_ReleaseWrite(&self->lock); /* Revert the increment that happened during Acquire. */ Atomic_Add(&self->master, -MASTER_INCREMENT); }
void VThreadBase_SetIsInSignal(VThreadID tid, // IN: Bool isInSignal) // IN: { VThreadBaseData *base = VThreadBaseCooked(); /* It is an error to clear isInSignal while not in a signal. */ ASSERT(Atomic_Read(&base->signalNestCount) > 0 || isInSignal); Atomic_Add(&base->signalNestCount, isInSignal ? 1 : -1); }