From 7c27c5c0e7a01c7a851dcb67a3fca8f5010526be Mon Sep 17 00:00:00 2001 From: Stephen Halter Date: Wed, 7 Oct 2015 19:01:57 -0700 Subject: [PATCH] Better handle blocks not taken taken from slabs - If the block needs to be larger than 4032 bytes it won't be backed by a slab --- .../Filter/SocketInputStream.cs | 5 ++--- src/Microsoft.AspNet.Server.Kestrel/Http/SocketInput.cs | 4 +++- .../Infrastructure/MemoryPoolBlock2.cs | 9 --------- 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Kestrel/Filter/SocketInputStream.cs b/src/Microsoft.AspNet.Server.Kestrel/Filter/SocketInputStream.cs index 43f0d0e704..594d2e45ba 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Filter/SocketInputStream.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Filter/SocketInputStream.cs @@ -18,7 +18,6 @@ namespace Microsoft.AspNet.Server.Kestrel.Filter public class SocketInputStream : Stream { private static Task _emptyTask = Task.FromResult(null); - private static byte[] _emptyBuffer = new byte[0]; private readonly SocketInput _socketInput; @@ -91,8 +90,8 @@ namespace Microsoft.AspNet.Server.Kestrel.Filter protected override void Dispose(bool disposing) { - // Close _socketInput with a 0-length write. - Write(_emptyBuffer, 0, 0); + // Close _socketInput with a fake zero-length write that will result in a zero-length read. + _socketInput.IncomingComplete(0, error: null); base.Dispose(disposing); } } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/SocketInput.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/SocketInput.cs index 6352b742ef..0eb74bb906 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/SocketInput.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/SocketInput.cs @@ -90,6 +90,8 @@ namespace Microsoft.AspNet.Server.Kestrel.Http // Unpin may called without an earlier Pin if (_pinned != null) { + _pinned.Unpin(); + _pinned.End += count; if (_head == null) { @@ -170,7 +172,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http { var returnBlock = returnStart; returnStart = returnStart.Next; - returnBlock.Pool.Return(returnBlock); + returnBlock.Pool?.Return(returnBlock); } } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/MemoryPoolBlock2.cs b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/MemoryPoolBlock2.cs index c6fd9bd7a3..6e7aadfa26 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/MemoryPoolBlock2.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/MemoryPoolBlock2.cs @@ -130,15 +130,6 @@ namespace Microsoft.AspNet.Server.Kestrel.Infrastructure } } - public static MemoryPoolBlock2 Create(int size, MemoryPool2 pool) - { - return new MemoryPoolBlock2 - { - Data = new ArraySegment(new byte[size]), - Pool = pool - }; - } - public static MemoryPoolBlock2 Create( ArraySegment data, IntPtr dataPtr,