8[DebuggerDisplay(
"Items={ItemsCountForDebugger}, Capacity={_bufferedCapacity}, Mode={_mode}, Closed={ChannelIsClosedForDebugger}")]
12 [DebuggerDisplay(
"Items={ItemsCountForDebugger}")]
35 return parent._items.
Count;
54 if (!parent._items.IsEmpty)
69 if (!parent._items.IsEmpty)
71 item = parent._items.PeekHead();
88 if (!parent._items.IsEmpty)
92 if (parent._doneWriting !=
null)
94 return ChannelUtilities.GetInvalidCompletionValueTask<T>(parent._doneWriting);
118 lock (parent.SyncObj)
120 if (!parent._items.IsEmpty)
124 if (parent._doneWriting !=
null)
146 T result = parent._items.DequeueHead();
147 if (parent._doneWriting !=
null)
149 if (parent._items.IsEmpty)
156 while (!parent._blockedWriters.IsEmpty)
176 [DebuggerDisplay(
"Items={ItemsCountForDebugger}, Capacity={CapacityForDebugger}")]
201 lock (parent.SyncObj)
203 if (parent._doneWriting !=
null)
208 isEmpty = parent._items.IsEmpty;
230 if (parent._doneWriting !=
null)
237 if (
count < parent._bufferedCapacity)
239 parent._items.EnqueueTail(
item);
250 parent._itemDropped?.Invoke(
item);
253 T
obj = ((parent._mode ==
BoundedChannelFullMode.DropNewest) ? parent._items.DequeueTail() : parent._items.DequeueHead());
254 parent._items.EnqueueTail(
item);
257 parent._itemDropped?.Invoke(
obj);
260 while (!parent._blockedReaders.IsEmpty)
271 parent._items.EnqueueTail(
item);
272 listTail = parent._waitingReadersTail;
277 parent._waitingReadersTail =
null;
305 lock (parent.SyncObj)
307 if (parent._doneWriting !=
null)
311 if (parent._items.
Count < parent._bufferedCapacity || parent._mode != 0)
343 if (parent._doneWriting !=
null)
350 if (
count < parent._bufferedCapacity)
352 parent._items.EnqueueTail(
item);
362 writerSingleton.Item =
item;
368 voidAsyncOperationWithData.Item =
item;
376 parent._itemDropped?.Invoke(
item);
379 T
obj = ((parent._mode ==
BoundedChannelFullMode.DropNewest) ? parent._items.DequeueTail() : parent._items.DequeueHead());
380 parent._items.EnqueueTail(
item);
383 parent._itemDropped?.Invoke(
obj);
386 while (!parent._blockedReaders.IsEmpty)
397 parent._items.EnqueueTail(
item);
398 listTail = parent._waitingReadersTail;
403 parent._waitingReadersTail =
null;
Enumerator GetEnumerator()
BoundedChannelReader(BoundedChannel< T > parent)
T DequeueItemAndPostProcess()
override ValueTask< T > ReadAsync(CancellationToken cancellationToken)
override bool TryPeek([MaybeNullWhen(false)] out T item)
override bool TryRead([MaybeNullWhen(false)] out T item)
int ItemsCountForDebugger
override ValueTask< bool > WaitToReadAsync(CancellationToken cancellationToken)
readonly BoundedChannel< T > _parent
readonly AsyncOperation< bool > _waiterSingleton
readonly AsyncOperation< T > _readerSingleton
readonly VoidAsyncOperationWithData< T > _writerSingleton
readonly BoundedChannel< T > _parent
BoundedChannelWriter(BoundedChannel< T > parent)
readonly AsyncOperation< bool > _waiterSingleton
int ItemsCountForDebugger
override bool TryComplete(Exception error)
override ValueTask WriteAsync(T item, CancellationToken cancellationToken)
override ValueTask< bool > WaitToWriteAsync(CancellationToken cancellationToken)
override bool TryWrite(T item)
readonly int _bufferedCapacity
AsyncOperation< bool > _waitingReadersTail
readonly TaskCompletionSource _completion
readonly BoundedChannelFullMode _mode
readonly Deque< VoidAsyncOperationWithData< T > > _blockedWriters
BoundedChannel(int bufferedCapacity, BoundedChannelFullMode mode, bool runContinuationsAsynchronously, Action< T > itemDropped)
int ItemsCountForDebugger
readonly Deque< T > _items
bool ChannelIsClosedForDebugger
readonly bool _runContinuationsAsynchronously
readonly Action< T > _itemDropped
readonly Deque< AsyncOperation< T > > _blockedReaders
AsyncOperation< bool > _waitingWritersTail
static void QueueWaiter(ref AsyncOperation< bool > tail, AsyncOperation< bool > waiter)
static readonly Exception s_doneWritingSentinel
static void Complete(TaskCompletionSource tcs, Exception error=null)
static void WakeUpWaiters(ref AsyncOperation< bool > listTail, bool result, Exception error=null)
static Exception CreateInvalidCompletionException(Exception inner=null)
static void Exit(object obj)
static void Enter(object obj)
static Task FromException(Exception exception)
static Task FromCanceled(CancellationToken cancellationToken)