Sockets: do 0 byte reads to avoid allocating memory for idle connections
- Do not do 0 byte reads on OSX due to potential sockets bug
This commit is contained in:
parent
912c36a6e0
commit
0b471f2b2f
|
|
@ -21,6 +21,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal
|
|||
{
|
||||
private static readonly int MinAllocBufferSize = KestrelMemoryPool.MinimumSegmentSize / 2;
|
||||
private static readonly bool IsWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
|
||||
private static readonly bool IsMacOS = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);
|
||||
|
||||
private readonly Socket _socket;
|
||||
private readonly PipeScheduler _scheduler;
|
||||
|
|
@ -164,6 +165,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal
|
|||
{
|
||||
while (true)
|
||||
{
|
||||
// MacOS blocked on https://github.com/dotnet/corefx/issues/31766
|
||||
if (!IsMacOS)
|
||||
{
|
||||
// Wait for data before allocating a buffer.
|
||||
await _receiver.WaitForDataAsync();
|
||||
}
|
||||
|
||||
// Ensure we have some reasonable amount of buffer space
|
||||
var buffer = Input.GetMemory(MinAllocBufferSize);
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,18 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal
|
|||
{
|
||||
}
|
||||
|
||||
public SocketAwaitableEventArgs WaitForDataAsync()
|
||||
{
|
||||
_awaitableEventArgs.SetBuffer(Array.Empty<byte>(), 0, 0);
|
||||
|
||||
if (!_socket.ReceiveAsync(_awaitableEventArgs))
|
||||
{
|
||||
_awaitableEventArgs.Complete();
|
||||
}
|
||||
|
||||
return _awaitableEventArgs;
|
||||
}
|
||||
|
||||
public SocketAwaitableEventArgs ReceiveAsync(Memory<byte> buffer)
|
||||
{
|
||||
#if NETCOREAPP2_1
|
||||
|
|
|
|||
Loading…
Reference in New Issue