예제 #1
0
            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 });
            }
예제 #2
0
        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);
        }
예제 #3
0
 public ExclusiveReaderLockSource(AsyncReaderWriterLock host, ExclusiveReaderLock erLock) : base(host, false)
 {
     ExclusiveReaderLock = erLock;
 }
 public ExclusiveReaderLockSource(AsyncReaderWriterLock host, ExclusiveReaderLock erLock) : base(host, false) {
     ExclusiveReaderLock = erLock;
 }
예제 #5
0
            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 };
            }