예제 #1
0
 public static void FailFastLock()
 {
     using var sharedLock = new AsyncSharedLock(3);
     True(sharedLock.TryAcquire(false));
     True(sharedLock.TryAcquire(false));
     True(sharedLock.TryAcquire(false));
     False(sharedLock.TryAcquire(true));
     False(sharedLock.TryAcquire(false));
     sharedLock.Release();
     sharedLock.Release();
     sharedLock.Release();
     True(sharedLock.TryAcquire(true));
     False(sharedLock.TryAcquire(false));
 }
예제 #2
0
        private static async void AcquireWeakLockAndRelease(AsyncSharedLock sharedLock, AsyncCountdownEvent acquireEvent)
        {
            await Task.Delay(100);

            await sharedLock.Acquire(false, TimeSpan.Zero);

            acquireEvent.Signal();
            await Task.Delay(100);

            sharedLock.Release();
        }
예제 #3
0
        public static void GracefulShutdown()
        {
            using var @lock = new AsyncSharedLock(3);
            True(@lock.TryAcquire(false));
            var task = @lock.DisposeAsync();

            False(task.IsCompleted);
            @lock.Release();
            True(task.IsCompletedSuccessfully);
            Throws <ObjectDisposedException>(() => @lock.TryAcquire(true));
        }
예제 #4
0
 public static void DowngradeFromStrongToWeakLock()
 {
     using var sharedLock = new AsyncSharedLock(3);
     True(sharedLock.TryAcquire(true));
     Equal(0, sharedLock.RemainingCount);
     False(sharedLock.TryAcquire(false));
     sharedLock.Downgrade();
     Equal(2, sharedLock.RemainingCount);
     sharedLock.Release();
     Equal(3, sharedLock.RemainingCount);
 }
예제 #5
0
        public static async Task StrongToWeakLockTransition()
        {
            using var acquireEvent = new AsyncCountdownEvent(2L);
            using var sharedLock   = new AsyncSharedLock(3);
            await sharedLock.AcquireAsync(true, TimeSpan.Zero);

            AcquireWeakLock(sharedLock, acquireEvent);
            AcquireWeakLock(sharedLock, acquireEvent);
            sharedLock.Release();
            True(await acquireEvent.WaitAsync(DefaultTimeout));
            Equal(1, sharedLock.RemainingCount);
        }
예제 #6
0
        public static async Task StrongToWeakLockTransition()
        {
            using (var acquireEvent = new AsyncCountdownEvent(2L))
                using (var sharedLock = new AsyncSharedLock(3))
                {
                    await sharedLock.Acquire(true, TimeSpan.Zero);

                    AcquireWeakLock(sharedLock, acquireEvent);
                    AcquireWeakLock(sharedLock, acquireEvent);
                    sharedLock.Release();
                    True(await acquireEvent.Wait(TimeSpan.FromMinutes(1)));
                    Equal(1, sharedLock.RemainingCount);
                }
        }
예제 #7
0
        public static void GracefulShutdown4()
        {
            using var @lock = new AsyncSharedLock(3);
            True(@lock.TryAcquire(true));
            var acquisition1 = @lock.AcquireAsync(false, CancellationToken.None);

            False(acquisition1.IsCompleted);
            var task = @lock.DisposeAsync();

            False(task.IsCompleted);
            var acquisition2 = @lock.AcquireAsync(false, CancellationToken.None);

            False(task.IsCompleted);

            @lock.Release();
            True(acquisition1.IsCompletedSuccessfully);
            False(acquisition2.IsCompleted);
            False(task.IsCompleted);

            @lock.Release();
            True(acquisition2.IsFaulted);
            True(task.IsCompletedSuccessfully);
            Throws <ObjectDisposedException>(acquisition2.GetAwaiter().GetResult);
        }
예제 #8
0
 public static async Task WeakLocks()
 {
     using var sharedLock = new AsyncSharedLock(3);
     Equal(3, sharedLock.ConcurrencyLevel);
     True(await sharedLock.TryAcquireAsync(false, TimeSpan.Zero));
     True(await sharedLock.TryAcquireAsync(false, TimeSpan.Zero));
     Equal(1, sharedLock.RemainingCount);
     True(await sharedLock.TryAcquireAsync(false, TimeSpan.Zero));
     Equal(0, sharedLock.RemainingCount);
     False(await sharedLock.TryAcquireAsync(false, TimeSpan.Zero));
     False(await sharedLock.TryAcquireAsync(true, TimeSpan.Zero));
     sharedLock.Release();
     Equal(1, sharedLock.RemainingCount);
     False(await sharedLock.TryAcquireAsync(true, TimeSpan.Zero));
     True(await sharedLock.TryAcquireAsync(false, TimeSpan.Zero));
 }
예제 #9
0
 public static async Task WeakLocks()
 {
     using (var sharedLock = new AsyncSharedLock(3))
     {
         True(await sharedLock.TryAcquire(false, TimeSpan.Zero));
         True(await sharedLock.TryAcquire(false, TimeSpan.Zero));
         Equal(1, sharedLock.RemainingCount);
         True(await sharedLock.TryAcquire(false, TimeSpan.Zero));
         Equal(0, sharedLock.RemainingCount);
         False(await sharedLock.TryAcquire(false, TimeSpan.Zero));
         False(await sharedLock.TryAcquire(true, TimeSpan.Zero));
         sharedLock.Release();
         Equal(1, sharedLock.RemainingCount);
         False(await sharedLock.TryAcquire(true, TimeSpan.Zero));
         True(await sharedLock.TryAcquire(false, TimeSpan.Zero));
     }
 }