private void ExitAndWakeUpAppropriateWaiters()
{
Debug.Assert(MyLockHeld);
// First a writing thread waiting on being upgraded
if (owners == 1 && numUpgradeWaiters != 0)
{
// Exit before signaling to improve efficiency (wakee will need the lock)
ExitMyLock();
// release all upgraders (however there can be at most one).
upgradeEvent.Set();
// TODO: What does the following comment mean?
// two threads upgrading is a guarenteed deadlock, so we throw in that case.
}
else if (owners == 0 && numWriteWaiters > 0)
{
// Exit before signaling to improve efficiency (wakee will need the lock)
ExitMyLock();
// release one writer.
writeEvent.Set();
}
else if (owners >= 0 && numReadWaiters != 0)
{
// Exit before signaling to improve efficiency (wakee will need the lock)
ExitMyLock();
// release all readers.
readEvent.Set();
}
else
ExitMyLock();
}