public bool TryEnterUpgradeableReadLock (int millisecondsTimeout)
{
if (millisecondsTimeout < Timeout.Infinite)
throw new ArgumentOutOfRangeException ("millisecondsTimeout");
if (read_locks == null)
throw new ObjectDisposedException (null);
if (IsUpgradeableReadLockHeld)
throw new LockRecursionException ();
if (IsWriteLockHeld)
throw new LockRecursionException ();
EnterMyLock ();
while (true){
if (owners == 0 && numWriteWaiters == 0 && upgradable_thread == null){
owners++;
upgradable_thread = Thread.CurrentThread;
break;
}
// If the request is to probe
if (millisecondsTimeout == 0){
ExitMyLock ();
return false;
}
if (readEvent == null){
LazyCreateEvent (ref readEvent, false);
// since we left the lock, start over.
continue;
}
if (!WaitOnEvent (readEvent, ref numReadWaiters, millisecondsTimeout))
return false;
}
ExitMyLock ();
return true;
}