public void TryEnter(int millisecondsTimeout, ref bool lockTaken) { if (_disableThreadTracking) { if (ThreadingHelper.SpinWaitSet(ref _isHeld, 1, 0, millisecondsTimeout)) { lockTaken = true; } } else { if (IsHeldByCurrentThread) { //Throw on recursion throw new LockRecursionException(); } else { if (ThreadingHelper.SpinWaitSet(ref _isHeld, 1, 0, millisecondsTimeout) && ReferenceEquals(Interlocked.CompareExchange(ref _ownerThread, Thread.CurrentThread, null), null)) { lockTaken = true; } } } }
public void TryEnter(int millisecondsTimeout, ref bool lockTaken) { if (IsThreadOwnerTrackingEnabled) { lockTaken |= ThreadingHelper.SpinWaitSet(ref _isHeld, 1, 0, millisecondsTimeout); } else { if (IsHeldByCurrentThread) { //Throw on recursion throw new LockRecursionException(); } lockTaken |= ThreadingHelper.SpinWaitSet(ref _isHeld, 1, 0, millisecondsTimeout) && Interlocked.CompareExchange(ref _ownerThread, Thread.CurrentThread, null) == null; } }