Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
 internal RecvChannelOperation(ChannelBase channel, CompletionEvent evt, Action <object> action) : base(channel, evt)
 {
     _action = action;
 }
Exemplo n.º 4
0
 internal SelectLogic()
 {
     _channelOperations = new List <ChannelOperation>();
     _evt = new CompletionEvent();
     _selectFireContext = new SelectFireContext();
 }
Exemplo n.º 5
0
 internal RecvChannelOperation(ChannelBase channel, CompletionEvent evt) : base(channel, evt)
 {
     _action = null;
 }