public bool TryAcquireWriteLock(TimeSpan timeout, out IWriteLockAcquisition writeLockAcquisition)
            {
                if (Owner.InternalLock.RecursionPolicy == LockRecursionPolicy.NoRecursion && 
                    (Owner.InternalLock.IsReadLockHeld || Owner.InternalLock.IsUpgradeableReadLockHeld || Owner.InternalLock.IsWriteLockHeld))
                {
                    writeLockAcquisition = null;
                    return false;
                }

                if (Owner.InternalLock.RecursionPolicy == LockRecursionPolicy.SupportsRecursion && 
                    !(Owner.InternalLock.IsUpgradeableReadLockHeld || Owner.InternalLock.IsWriteLockHeld))
                {
                    writeLockAcquisition = null;
                    return false;
                }

                var ok = Owner.InternalLock.TryEnterWriteLock(timeout);

                writeLockAcquisition = new WriteLockAcquisition(Owner);
                return true;
            }
            public bool TryAcquireWriteLock(TimeSpan timeout, out IWriteLockAcquisition writeLockAcquisition)
            {
                if (Owner.InternalLock.RecursionPolicy == LockRecursionPolicy.NoRecursion &&
                    (Owner.InternalLock.IsReadLockHeld || Owner.InternalLock.IsUpgradeableReadLockHeld || Owner.InternalLock.IsWriteLockHeld))
                {
                    writeLockAcquisition = null;
                    return false;
                }

                if (Owner.InternalLock.RecursionPolicy == LockRecursionPolicy.SupportsRecursion &&
                    !(Owner.InternalLock.IsUpgradeableReadLockHeld || Owner.InternalLock.IsWriteLockHeld))
                {
                    writeLockAcquisition = null;
                    return false;
                }

                var disposables = (IDisposable)null;
                var ok = Owner.TryLockChildren(LockTypes.Write, timeout, out disposables);

                if (ok)
                {
                    ok = Owner.InternalLock.TryEnterWriteLock(timeout);

                    if (ok)
                    {
                        writeLockAcquisition = new WriteLockAcquisition(Owner, disposables);
                        return true;
                    }
                    else
                    {
                        disposables?.Dispose();
                    }
                }

                writeLockAcquisition = null;
                return false;
            }
 public override bool TryAcquireWriteLock(TimeSpan timeout, out IWriteLockAcquisition writeableLockAcquisition)
 {
     var sw = Stopwatch.StartNew();
     var r = base.TryAcquireWriteLock(timeout, out writeableLockAcquisition);
     sw.Stop();
     SUBJECT__Write.OnNext(sw.Elapsed.TotalMilliseconds);
     return r;
 }
Exemplo n.º 4
0
 public BulkUpdate(ISupportsBulkUpdate owner, IWriteLockAcquisition lockAcquisition)
 {
     this.Owner = owner;
     LockAcquisition = lockAcquisition;
 }
 public bool TryUpgradeToWriteLock(TimeSpan timeout, out IWriteLockAcquisition writeLockAcquisition)
 {
     throw new NotImplementedException();
 }
        public bool TryAcquireWriteLock(TimeSpan timeout, out IWriteLockAcquisition writeableLockAcquisition)
        {
            if (InternalLock.RecursionPolicy == LockRecursionPolicy.NoRecursion &&
                (InternalLock.IsReadLockHeld || InternalLock.IsUpgradeableReadLockHeld || InternalLock.IsWriteLockHeld))
            {
                writeableLockAcquisition = null;
                return false;
            }

            if (InternalLock.RecursionPolicy == LockRecursionPolicy.SupportsRecursion &&
                !(InternalLock.IsUpgradeableReadLockHeld || InternalLock.IsWriteLockHeld))
            {
                writeableLockAcquisition = null;
                return false;
            }

            if (InternalLock.TryEnterWriteLock(timeout))
            {
                writeableLockAcquisition = new WriteLockAcquisition(owner: this);
                return true;
            }
            else
            {
                writeableLockAcquisition = null;
                return false;
            }
        }