private static AsyncLock GetExclusiveLock <T>(this T obj)
            where T : class
        {
            AsyncLock @lock;

            switch (obj)
            {
            case null:
                throw new ArgumentNullException(nameof(obj));

            case AsyncExclusiveLock exclusive:
                @lock = AsyncLock.Exclusive(exclusive);
                break;

            case SemaphoreSlim semaphore:
                @lock = AsyncLock.Semaphore(semaphore);
                break;

            case AsyncReaderWriterLock rwl:
                @lock = AsyncLock.WriteLock(rwl);
                break;

            case ReaderWriterLockSlim _:
            case WaitHandle _:
            case ReaderWriterLock _:
                throw new ArgumentException(ExceptionMessages.UnsupportedLockAcquisition, nameof(obj));

            default:
                @lock = AsyncLock.Exclusive(obj.GetUserData()
                                            .GetOrSet(ExclusiveLock, () => new AsyncExclusiveLock()));
                break;
            }

            return(@lock);
        }
        private static AsyncLock GetExclusiveLock <T>(this T obj)
            where T : class
        {
            AsyncLock @lock;

            switch (obj)
            {
            case null:
                throw new ArgumentNullException(nameof(obj));

            case AsyncSharedLock shared:
                @lock = AsyncLock.Exclusive(shared);
                break;

            case AsyncExclusiveLock exclusive:
                @lock = AsyncLock.Exclusive(exclusive);
                break;

            case SemaphoreSlim semaphore:
                @lock = AsyncLock.Semaphore(semaphore);
                break;

            case AsyncReaderWriterLock rwl:
                @lock = AsyncLock.WriteLock(rwl);
                break;

            case ReaderWriterLockSlim _:
            case WaitHandle _:
            case ReaderWriterLock _:
            case string str when !(string.IsInterned(str) is null):
                throw new InvalidOperationException(ExceptionMessages.UnsupportedLockAcquisition);

            default:
                @lock = AsyncLock.Exclusive(obj.GetUserData().GetOrSet(ExclusiveLock));
                break;
            }

            return(@lock);
        }
Exemple #3
0
 /// <summary>
 /// Acquires reader lock associated with the given object.
 /// </summary>
 /// <typeparam name="T">The type of the object to be locked.</typeparam>
 /// <param name="obj">The object to be locked.</param>
 /// <param name="token">The token that can be used to abort acquisition operation.</param>
 /// <returns>The acquired lock holder.</returns>
 public static Task <AsyncLock.Holder> AcquireWriteLockAsync <T>(this T obj, CancellationToken token)
     where T : class => AsyncLock.WriteLock(obj.GetReaderWriterLock()).AcquireAsync(token);
Exemple #4
0
 /// <summary>
 /// Acquires writer lock associated with the given object.
 /// </summary>
 /// <typeparam name="T">The type of the object to be locked.</typeparam>
 /// <param name="obj">The object to be locked.</param>
 /// <param name="timeout">The interval to wait for the lock.</param>
 /// <returns>The acquired lock holder.</returns>
 /// <exception cref="TimeoutException">The lock cannot be acquired during the specified amount of time.</exception>
 public static Task <AsyncLock.Holder> AcquireWriteLockAsync <T>(this T obj, TimeSpan timeout)
     where T : class => AsyncLock.WriteLock(obj.GetReaderWriterLock()).AcquireAsync(timeout);