示例#1
0
        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);
        }
示例#2
0
        public void AcquireAndRelease()
        {
            var l = new TrackedLock(Locks, "A");

            Assert.IsTrue(l.TryEnter().Success);
            Assert.IsTrue(l.IsHeld);
            l.Exit();
            Assert.IsFalse(l.IsHeld);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        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);
                }
            }
                                ));
        }
示例#7
0
        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);
        }
示例#8
0
        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"));
        }