public void SharedTest1() { var commandLock = new CommandLock(); try { // should be able to aquire multiple shared locks Task t1 = commandLock.AquireShared(); Assert.True(t1.IsCompleted); Task t2 = commandLock.AquireShared(); Assert.True(t2.IsCompleted); Task <ExclusiveLockToken> t3 = commandLock.AquireExclusive(); Assert.False(t3.IsCompleted); commandLock.ReleaseShared(); Assert.False(t3.IsCompleted); commandLock.ReleaseShared(); Assert.True(t3.IsCompleted); } finally { commandLock.Close("Test complete"); } }
public void ExclusiveThenSharedTest() { var commandLock = new CommandLock(); try { // Part 1 - try and aquire the shared lock while the exclusive lock is held Task <ExclusiveLockToken> t1 = commandLock.AquireExclusive(); Assert.True(t1.IsCompleted); Task t2 = commandLock.AquireShared(); Assert.False(t2.IsCompleted); ExclusiveLockToken token = t1.Result; token.Close(); Assert.True(t2.IsCompleted, "Closing t1 should signal t2"); Assert.True(ExclusiveLockToken.IsNullOrClosed(token), "Closing the token should zero it out"); commandLock.ReleaseShared(); // Part 2 - release the exclusive lock before attempting to aquire the shared lock t1 = commandLock.AquireExclusive(); Assert.True(t1.IsCompleted); t1.Result.Close(); t2 = commandLock.AquireShared(); Assert.True(t2.IsCompleted, "Shared lock should be immediately aquired"); } finally { commandLock.Close("Test complete"); } }
public void SharedThenExclusiveTest() { using (var commandLock = new CommandLock()) { // should be able to aquire multiple shared locks Task t1 = commandLock.AquireShared(); Assert.True(t1.IsCompleted); Task t2 = commandLock.AquireShared(); Assert.True(t2.IsCompleted); commandLock.ReleaseShared(); commandLock.ReleaseShared(); Task <ExclusiveLockToken> t3 = commandLock.AquireExclusive(); Assert.True(t3.IsCompleted); } }