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();
}