diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/SocketOutput.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/SocketOutput.cs index be47d8e720..404cb601d5 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/SocketOutput.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/SocketOutput.cs @@ -305,12 +305,9 @@ namespace Microsoft.AspNet.Server.Kestrel.Http var returnBlock = block; block = block.Next; - returnBlock.Unpin(); returnBlock.Pool?.Return(returnBlock); } - _tail.Unpin(); - if (_isProducing) { _returnFromOnProducingComplete = _tail; @@ -381,6 +378,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http var writeReq = new UvWriteReq(Self._log); writeReq.Init(Self._thread.Loop); + writeReq.Write(Self._socket, _lockedStart, _lockedEnd, _bufferCount, (_writeReq, status, error, state) => { _writeReq.Dispose(); @@ -453,6 +451,8 @@ namespace Microsoft.AspNet.Server.Kestrel.Http returnBlock.Unpin(); returnBlock.Pool?.Return(returnBlock); } + + _lockedEnd.Block.Unpin(); } private void LockWrite() diff --git a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/MemoryPoolBlock2.cs b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/MemoryPoolBlock2.cs index 2bcd21d9a2..26156c6cc0 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/MemoryPoolBlock2.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/MemoryPoolBlock2.cs @@ -105,15 +105,13 @@ namespace Microsoft.AspNet.Server.Kestrel.Infrastructure /// public IntPtr Pin() { + Debug.Assert(!_pinHandle.IsAllocated); + if (_dataArrayPtr != IntPtr.Zero) { // this is a slab managed block - use the native address of the slab which is always locked return _dataArrayPtr; } - else if (_pinHandle.IsAllocated) - { - return _pinHandle.AddrOfPinnedObject(); - } else { // this is one-time-use memory - lock the managed memory until Unpin is called diff --git a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvWriteReq.cs b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvWriteReq.cs index 7330ef3c15..2695036f32 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvWriteReq.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvWriteReq.cs @@ -85,6 +85,14 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking _callback = null; _state = null; Unpin(this); + + var block = start.Block; + for (var index = 0; index < nBuffers; index++) + { + block.Unpin(); + block = block.Next; + } + throw; } }