Exemplo n.º 1
0
 public static async Task TrivialLock()
 {
     using (var rwLock = new AsyncReaderWriterLock())
     {
         //read lock
         True(await rwLock.TryEnterReadLock(TimeSpan.FromMilliseconds(10)));
         True(await rwLock.TryEnterReadLock(TimeSpan.FromMilliseconds(10)));
         False(await rwLock.TryEnterWriteLock(TimeSpan.FromMilliseconds(20)));
         rwLock.ExitReadLock();
         False(await rwLock.TryEnterWriteLock(TimeSpan.FromMilliseconds(20)));
         rwLock.ExitReadLock();
         //write lock
         True(await rwLock.TryEnterWriteLock(TimeSpan.FromMilliseconds(20)));
         False(await rwLock.TryEnterReadLock(TimeSpan.FromMilliseconds(20)));
         rwLock.ExitWriteLock();
         //upgradeable read lock
         True(await rwLock.TryEnterReadLock(TimeSpan.FromMilliseconds(10)));
         True(await rwLock.TryEnterReadLock(TimeSpan.FromMilliseconds(10)));
         True(await rwLock.TryEnterUpgradeableReadLock(TimeSpan.FromMilliseconds(20)));
         False(await rwLock.TryEnterWriteLock(TimeSpan.FromMilliseconds(20)));
         False(await rwLock.TryEnterUpgradeableReadLock(TimeSpan.FromMilliseconds(20)));
         rwLock.ExitUpgradeableReadLock();
         False(await rwLock.TryEnterWriteLock(TimeSpan.FromMilliseconds(20)));
         True(await rwLock.TryEnterUpgradeableReadLock(TimeSpan.FromMilliseconds(20)));
         rwLock.ExitReadLock();
         False(await rwLock.TryEnterUpgradeableReadLock(TimeSpan.FromMilliseconds(20)));
         rwLock.ExitReadLock();
         rwLock.ExitUpgradeableReadLock();
     }
 }
Exemplo n.º 2
0
        public static async Task InvalidExits()
        {
            using (var rwLock = new AsyncReaderWriterLock())
            {
                Throws <SynchronizationLockException>(rwLock.ExitReadLock);
                Throws <SynchronizationLockException>(rwLock.ExitUpgradeableReadLock);
                Throws <SynchronizationLockException>(rwLock.ExitWriteLock);

                await rwLock.EnterReadLock(TimeSpan.FromMilliseconds(10));

                Throws <SynchronizationLockException>(rwLock.ExitUpgradeableReadLock);
                Throws <SynchronizationLockException>(rwLock.ExitWriteLock);
                rwLock.ExitReadLock();

                await rwLock.EnterUpgradeableReadLock(TimeSpan.FromMilliseconds(10));

                Throws <SynchronizationLockException>(rwLock.ExitReadLock);
                Throws <SynchronizationLockException>(rwLock.ExitWriteLock);
                rwLock.ExitUpgradeableReadLock();

                await rwLock.EnterWriteLock(TimeSpan.FromMilliseconds(10));

                Throws <SynchronizationLockException>(rwLock.ExitReadLock);
                Throws <SynchronizationLockException>(rwLock.ExitUpgradeableReadLock);
                rwLock.ExitWriteLock();
            }
        }
        public static void GracefulShutdown2()
        {
            using var @lock = new AsyncReaderWriterLock();
            True(@lock.TryEnterReadLock());
            var task = @lock.DisposeAsync();

            False(task.IsCompleted);
            var acquisition = @lock.EnterWriteLockAsync(CancellationToken.None);

            False(acquisition.IsCompleted);
            @lock.ExitReadLock();
            True(task.IsCompletedSuccessfully);
            True(acquisition.IsFaulted);
            Throws <ObjectDisposedException>(acquisition.GetAwaiter().GetResult);
        }
Exemplo n.º 4
0
        public static void OptimisticRead()
        {
            using var rwLock = new AsyncReaderWriterLock();
            var stamp = rwLock.TryOptimisticRead();

            True(stamp.IsValid);
            True(rwLock.TryEnterReadLock());
            Equal(1, rwLock.CurrentReadCount);
            True(stamp.IsValid);
            rwLock.ExitReadLock();
            Equal(stamp, rwLock.TryOptimisticRead());
            True(rwLock.TryEnterWriteLock());
            False(rwLock.IsReadLockHeld);
            True(rwLock.IsWriteLockHeld);
            False(stamp.IsValid);
        }
Exemplo n.º 5
0
        public static async Task WriterToReaderChain()
        {
            using var are    = new AutoResetEvent(false);
            using var rwLock = new AsyncReaderWriterLock();
            await rwLock.EnterWriteLockAsync(DefaultTimeout);

            var task = new TaskCompletionSource <bool>();

            ThreadPool.QueueUserWorkItem(async state =>
            {
                False(await rwLock.TryEnterReadLockAsync(TimeSpan.FromMilliseconds(10)));
                True(ThreadPool.QueueUserWorkItem(static ev => ev.Set(), are, false));
                await rwLock.EnterReadLockAsync(DefaultTimeout);
                rwLock.ExitReadLock();
                task.SetResult(true);
            });