protected async Task <T> RecvCoreAsync <T>() { if (_isClosed) { throw new ChannelClosedException(); } Lock(); if (IsBuffered && _msgQueue.Any()) { var msg = _msgQueue.Dequeue(); if (_msgQueue.Count + 1 == _queueSize && _writerQueue.TryDequeue(out TransferQueueItem writerQueueItemFullMsgQueue)) { var msgFullMsgQueue = writerQueueItemFullMsgQueue.ChannelOperation.Msg; writerQueueItemFullMsgQueue.ChannelOperation.Notify(); _msgQueue.Enqueue(msgFullMsgQueue); } Unlock(); return((T)msg); } if (_writerQueue.TryDequeue(out TransferQueueItem writerQueueItem)) { Unlock(); var msg = writerQueueItem.ChannelOperation.Msg; writerQueueItem.ChannelOperation.Notify(); return((T)msg); } var evt = new CompletionEvent(); var recvOperation = new RecvChannelOperation(this, evt); _readerQueue.Enqueue(new TransferQueueItem(recvOperation)); Unlock(); await evt.WaitAsync(); if (_isClosed) { throw new ChannelClosedException(); } return((T)recvOperation.Msg); }
protected async Task <bool> SendCoreAsync(object msg) { if (_isClosed) { throw new ChannelClosedException(); } Lock(); if (_readerQueue.TryDequeue(out TransferQueueItem readerQueueItem)) { Unlock(); readerQueueItem.ChannelOperation.Msg = msg; readerQueueItem.ChannelOperation.Notify(); return(true); } if (IsBuffered && _msgQueue.Count < _queueSize) { _msgQueue.Enqueue(msg); Unlock(); return(true); } var evt = new CompletionEvent(); var sendOperation = new SendChannelOperation(this, evt, msg); _writerQueue.Enqueue(new TransferQueueItem(sendOperation)); Unlock(); await evt.WaitAsync(); if (_isClosed) { throw new ChannelClosedException(); } return(true); }
internal RecvChannelOperation(ChannelBase channel, CompletionEvent evt, Action <object> action) : base(channel, evt) { _action = action; }
internal SelectLogic() { _channelOperations = new List <ChannelOperation>(); _evt = new CompletionEvent(); _selectFireContext = new SelectFireContext(); }
internal RecvChannelOperation(ChannelBase channel, CompletionEvent evt) : base(channel, evt) { _action = null; }