public void IncomingData(byte[] buffer, int offset, int count) { lock (_sync) { // Must call Add() before bytes are available to consumer, to ensure that Length is >= 0 _bufferSizeControl?.Add(count); if (count > 0) { if (_tail == null) { _tail = _memory.Lease(); } var iterator = new MemoryPoolIterator(_tail, _tail.End); iterator.CopyFrom(buffer, offset, count); if (_head == null) { _head = _tail; } _tail = iterator.Block; } else { RemoteIntakeFin = true; } Complete(); } }
public void IncomingComplete(int count, Exception error) { Action awaitableState; lock (_sync) { // Must call Add() before bytes are available to consumer, to ensure that Length is >= 0 _bufferSizeControl?.Add(count); if (_pinned != null) { _pinned.End += count; if (_head == null) { _head = _tail = _pinned; } else if (_tail == _pinned) { // NO-OP: this was a read into unoccupied tail-space } else { Volatile.Write(ref _tail.Next, _pinned); _tail = _pinned; } _pinned = null; } if (error != null) { SetConnectionError(error); } else if (count == 0) { FinReceived(); } awaitableState = Interlocked.Exchange(ref _awaitableState, _awaitableIsCompleted); } Complete(awaitableState); }