public bool TryAcquireUpgradeableReadLock(TimeSpan timeout, out IUpgradeableReadLockAcquisition upgradeableReadLockAcquisition) { if (InternalLock.RecursionPolicy == LockRecursionPolicy.NoRecursion && (InternalLock.IsReadLockHeld || InternalLock.IsUpgradeableReadLockHeld || InternalLock.IsWriteLockHeld)) { upgradeableReadLockAcquisition = null; return false; } if (InternalLock.RecursionPolicy == LockRecursionPolicy.SupportsRecursion && !(InternalLock.IsUpgradeableReadLockHeld || InternalLock.IsWriteLockHeld)) { upgradeableReadLockAcquisition = null; return false; } if(InternalLock.TryEnterUpgradeableReadLock(timeout)) { upgradeableReadLockAcquisition = new UpgradeableReadLockAcquisition(owner: this); return true; } else { upgradeableReadLockAcquisition = null; return false; } }
public override bool TryAcquireUpgradeableReadLock(TimeSpan timeout, out IUpgradeableReadLockAcquisition upgradeableReadLockAcquisition) { var sw = Stopwatch.StartNew(); var r = base.TryAcquireUpgradeableReadLock(timeout, out upgradeableReadLockAcquisition); sw.Stop(); SUBJECT__UpgradeableRead.OnNext(sw.Elapsed.TotalMilliseconds); return r; }
public virtual bool TryAcquireUpgradeableReadLock(TimeSpan timeout, out IUpgradeableReadLockAcquisition upgradeableReadLockAcquisition) { if (InternalLock.RecursionPolicy == LockRecursionPolicy.NoRecursion && (InternalLock.IsReadLockHeld || InternalLock.IsUpgradeableReadLockHeld || InternalLock.IsWriteLockHeld)) { upgradeableReadLockAcquisition = null; return false; } if (InternalLock.RecursionPolicy == LockRecursionPolicy.SupportsRecursion && !(InternalLock.IsUpgradeableReadLockHeld || InternalLock.IsWriteLockHeld)) { upgradeableReadLockAcquisition = null; return false; } IDisposable disposables = (IDisposable)null; var ok = TryLockChildren(LockTypes.UpgradeableRead, timeout, out disposables); if (ok) { ok = InternalLock.TryEnterUpgradeableReadLock(timeout); if (ok) { upgradeableReadLockAcquisition = new UpgradeableReadLockAcquisition(owner: this, disposeWhenDone: disposables); return true; } else { disposables?.Dispose(); } } upgradeableReadLockAcquisition = null; return false; }