private LockSource[] FindFirstExclusiveReader(ExclusiveReaderLock erLock) { if (erLock.Tail == null) { return(new LockSource[0]); } var item = _head; while (item != erLock.Tail) { if (item.IsWriter) { return(new LockSource[0]); } if ((item as ExclusiveReaderLockSource)?.ExclusiveReaderLock == erLock) { return(new[] { item }); } item = item.Next; } return(new[] { item }); }
private Task <IAsyncReaderWriterLockToken> ExclusiveReaderLockAsync(ExclusiveReaderLock erLock, CancellationToken cancellationToken = default(CancellationToken)) { TaskUtilities.AssertIsOnBackgroundThread(); if (cancellationToken.IsCancellationRequested) { return(Task.FromCanceled <IAsyncReaderWriterLockToken>(cancellationToken)); } var source = new ExclusiveReaderLockSource(this, erLock); _queue.AddExclusiveReader(source, out var isAddedAfterWriterOrExclusiveReader); if (isAddedAfterWriterOrExclusiveReader) { source.RegisterCancellation(cancellationToken); } else { source.Release(); } return(source.Task); }
public ExclusiveReaderLockSource(AsyncReaderWriterLock host, ExclusiveReaderLock erLock) : base(host, false) { ExclusiveReaderLock = erLock; }
private LockSource[] FindFirstExclusiveReader(ExclusiveReaderLock erLock) { if (erLock.Tail == null) { return new LockSource[0]; } var item = _head; while (item != erLock.Tail) { if (item.IsWriter) { return new LockSource[0]; } if ((item as ExclusiveReaderLockSource)?.ExclusiveReaderLock == erLock) { return new[] { item }; } item = item.Next; } return new[] { item }; }