Resolve input/output via IDuplexPipe interface once (#6371)
This commit is contained in:
parent
0f65d44482
commit
ad11f890ef
|
|
@ -54,10 +54,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
|
||||||
_context.TimeoutControl,
|
_context.TimeoutControl,
|
||||||
this);
|
this);
|
||||||
|
|
||||||
|
Input = _context.Transport.Input;
|
||||||
Output = _http1Output;
|
Output = _http1Output;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PipeReader Input => _context.Transport.Input;
|
public PipeReader Input { get; }
|
||||||
|
|
||||||
public bool RequestTimedOut => _requestTimedOut;
|
public bool RequestTimedOut => _requestTimedOut;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -154,13 +154,15 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal
|
||||||
|
|
||||||
private async Task ProcessReceives()
|
private async Task ProcessReceives()
|
||||||
{
|
{
|
||||||
|
// Resolve `input` PipeWriter via the IDuplexPipe interface prior to loop start for performance.
|
||||||
|
var input = Input;
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
// Wait for data before allocating a buffer.
|
// Wait for data before allocating a buffer.
|
||||||
await _receiver.WaitForDataAsync();
|
await _receiver.WaitForDataAsync();
|
||||||
|
|
||||||
// Ensure we have some reasonable amount of buffer space
|
// Ensure we have some reasonable amount of buffer space
|
||||||
var buffer = Input.GetMemory(MinAllocBufferSize);
|
var buffer = input.GetMemory(MinAllocBufferSize);
|
||||||
|
|
||||||
var bytesReceived = await _receiver.ReceiveAsync(buffer);
|
var bytesReceived = await _receiver.ReceiveAsync(buffer);
|
||||||
|
|
||||||
|
|
@ -171,9 +173,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Input.Advance(bytesReceived);
|
input.Advance(bytesReceived);
|
||||||
|
|
||||||
var flushTask = Input.FlushAsync();
|
var flushTask = input.FlushAsync();
|
||||||
|
|
||||||
var paused = !flushTask.IsCompleted;
|
var paused = !flushTask.IsCompleted;
|
||||||
|
|
||||||
|
|
@ -238,9 +240,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal
|
||||||
|
|
||||||
private async Task ProcessSends()
|
private async Task ProcessSends()
|
||||||
{
|
{
|
||||||
|
// Resolve `output` PipeReader via the IDuplexPipe interface prior to loop start for performance.
|
||||||
|
var output = Output;
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
var result = await Output.ReadAsync();
|
var result = await output.ReadAsync();
|
||||||
|
|
||||||
if (result.IsCanceled)
|
if (result.IsCanceled)
|
||||||
{
|
{
|
||||||
|
|
@ -256,7 +260,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal
|
||||||
await _sender.SendAsync(buffer);
|
await _sender.SendAsync(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
Output.AdvanceTo(end);
|
output.AdvanceTo(end);
|
||||||
|
|
||||||
if (isCompleted)
|
if (isCompleted)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue