OpenMetaverse.ReaderWriterLockSlim.ExitAndWakeUpAppropriateWaiters C# (CSharp) Method

ExitAndWakeUpAppropriateWaiters() private method

Determines the appropriate events to set, leaves the locks, and sets the events.
private ExitAndWakeUpAppropriateWaiters ( ) : void
return void
        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();
        }