public void AcquireOnSameThreadFails() { var l = new TrackedLock(Locks, "A"); Assert.IsTrue(l.TryEnter().Success); Thread previousOwner; Assert.IsFalse(l.TryEnter(out previousOwner).Success); Assert.AreEqual(Thread.CurrentThread, previousOwner); Assert.AreEqual(l.TryEnter().FailureReason, TrackedLockFailureReason.HeldByCurrentThread); }
public void AcquireAndRelease() { var l = new TrackedLock(Locks, "A"); Assert.IsTrue(l.TryEnter().Success); Assert.IsTrue(l.IsHeld); l.Exit(); Assert.IsFalse(l.IsHeld); }
public void DisposeLockCollection() { var l = new TrackedLock(Locks, "A"); Assert.IsTrue(l.TryEnter().Success); Assert.IsTrue(l.IsHeld); Locks.Dispose(); Assert.IsTrue(l.IsHeld); Assert.IsFalse(l.IsDisposed); }
public void RecursiveAcquireOnSameThreadWorks() { var l = new TrackedLock(Locks, "A"); Assert.IsTrue(l.TryEnter().Success); Assert.AreEqual(0, l.RecursionDepth); Assert.IsTrue(l.TryEnter(recursive: true).Success); Assert.AreEqual(1, l.RecursionDepth); l.Exit(); Assert.IsTrue(l.IsHeld); Assert.AreEqual(0, l.RecursionDepth); l.Exit(); Assert.IsFalse(l.IsHeld); }
public void DisposeLock() { var l = new TrackedLock(Locks, "A"); Assert.IsTrue(l.TryEnter()); Assert.IsTrue(l.IsHeld); l.Dispose(); Assert.IsFalse(l.IsHeld); Assert.IsTrue(l.IsDisposed); }
public void AcquireOnOtherThreadFails() { var l = new TrackedLock(Locks, "A"); Assert.IsTrue(l.TryEnter().Success); Assert.AreEqual(Thread.CurrentThread, RunOnThread( () => { Thread previousOwner; if (l.TryEnter(out previousOwner).Success) { return(null); } else { return(previousOwner); } } )); }
public void HeldLockTracking() { var l = new TrackedLock(Locks, "A"); Assert.IsTrue(l.TryEnter().Success); Assert.AreEqual(Thread.CurrentThread, l.HeldBy); l.Exit(); Assert.AreEqual(null, l.HeldBy); }
public void WaitBlocksUntilReleased() { var log = new List <string>(); var l = new TrackedLock(Locks, "A"); lock (log) log.Add("Main+TryEnter"); Assert.IsTrue(l.TryEnter().Success); lock (log) log.Add("Main-TryEnter"); var threadStartedSignal = new AutoResetEvent(false); var waiterThread = new Thread( () => { threadStartedSignal.Set(); lock (log) log.Add("Waiter+Enter"); l.BlockingEnter(); lock (log) log.Add("Waiter-Enter"); l.Exit(); } ); waiterThread.Priority = ThreadPriority.Highest; waiterThread.Name = "Waiter"; waiterThread.Start(); threadStartedSignal.WaitOne(); // FIXME: There's a race here since WaitingThreadCount actually increases // slightly before the thread begins waiting. Bleh. while (l.WaitingThreadCount == 0) { Thread.Sleep(1); } lock (log) log.Add("Main+Exit"); l.Exit(); lock (log) log.Add("Main-Exit"); waiterThread.Join(); Assert.Less(log.IndexOf("Waiter+Enter"), log.IndexOf("Main+Exit")); Assert.Greater(log.IndexOf("Waiter-Enter"), log.IndexOf("Main-Exit")); }