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); }
/// <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);
/// <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);