in src/Transport/TcpTransport.cs [92:142]
public sealed override bool ReadAsync(TransportAsyncCallbackArgs args)
{
Fx.Assert(args.Buffer != null, "must have buffer(s) to read");
Fx.Assert(args.CompletedCallback != null, "must have a valid callback");
Fx.Assert(this.receiveEventArgs.Args == null, "read is pending");
ByteBuffer readBuffer = this.receiveEventArgs.PrepareRead(args.Count);
if (readBuffer != null)
{
// ensure the buffer is not reclaimed while read is pending
// ref count is decremented in read complete handler
this.receiveEventArgs.UserToken = readBuffer.AddReference();
if (readBuffer.Length > 0)
{
this.HandleReadComplete(args, true, true);
return false;
}
this.receiveEventArgs.SetBuffer(readBuffer.Buffer, readBuffer.Offset, readBuffer.Size);
}
else
{
this.receiveEventArgs.SetReadBuffer(args);
}
this.receiveEventArgs.Args = args;
Fx.Assert(this.receiveEventArgs.Count > 0, "Must have a count to read");
bool pending;
try
{
pending = this.socket.ReceiveAsync(this.receiveEventArgs);
}
catch
{
if (readBuffer != null)
{
readBuffer.Dispose();
}
throw;
}
if (!pending)
{
this.HandleReadComplete(args, false, true);
return false;
}
return true;
}