Ejemplo n.º 1
0
        private static async void AcquireWeakLockAndRelease(AsyncSharedLock sharedLock, AsyncCountdownEvent acquireEvent)
        {
            await Task.Delay(100);

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

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

            sharedLock.Release();
        }
Ejemplo n.º 2
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);
        }
Ejemplo n.º 3
0
        public static async Task WeakToStrongLockTransition()
        {
            using var acquireEvent = new AsyncCountdownEvent(3L);
            using var sharedLock   = new AsyncSharedLock(3);
            AcquireWeakLockAndRelease(sharedLock, acquireEvent);
            AcquireWeakLockAndRelease(sharedLock, acquireEvent);
            AcquireWeakLockAndRelease(sharedLock, acquireEvent);
            True(await acquireEvent.WaitAsync(DefaultTimeout));
            await sharedLock.AcquireAsync(true, DefaultTimeout);

            Equal(0, sharedLock.RemainingCount);
        }
Ejemplo n.º 4
0
        public static void GracefulShutdown5()
        {
            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.Downgrade();
            True(acquisition1.IsCompletedSuccessfully);
            False(acquisition2.IsCompleted);
            False(task.IsCompleted);

            @lock.Downgrade();
            True(acquisition2.IsFaulted);
            True(task.IsCompletedSuccessfully);
            Throws <ObjectDisposedException>(acquisition2.GetAwaiter().GetResult);
        }
Ejemplo n.º 5
0
        private static async void AcquireWeakLock(AsyncSharedLock sharedLock, AsyncCountdownEvent acquireEvent)
        {
            await sharedLock.AcquireAsync(false, DefaultTimeout, CancellationToken.None);

            acquireEvent.Signal();
        }