Return SocketInput blocks out of lock

This commit is contained in:
Ben Adams 2016-05-10 01:18:24 +01:00
parent 388841c1d8
commit 0e8cbe5df6
1 changed files with 13 additions and 13 deletions

View File

@ -175,11 +175,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Http
MemoryPoolIterator consumed, MemoryPoolIterator consumed,
MemoryPoolIterator examined) MemoryPoolIterator examined)
{ {
MemoryPoolBlock returnStart = null;
MemoryPoolBlock returnEnd = null;
lock (_sync) lock (_sync)
{ {
MemoryPoolBlock returnStart = null;
MemoryPoolBlock returnEnd = null;
if (!consumed.IsDefault) if (!consumed.IsDefault)
{ {
returnStart = _head; returnStart = _head;
@ -200,18 +200,18 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Http
_awaitableIsNotCompleted, _awaitableIsNotCompleted,
_awaitableIsCompleted); _awaitableIsCompleted);
} }
}
while (returnStart != returnEnd) while (returnStart != returnEnd)
{ {
var returnBlock = returnStart; var returnBlock = returnStart;
returnStart = returnStart.Next; returnStart = returnStart.Next;
returnBlock.Pool.Return(returnBlock); returnBlock.Pool.Return(returnBlock);
} }
if (Interlocked.CompareExchange(ref _consumingState, 0, 1) != 1) if (Interlocked.CompareExchange(ref _consumingState, 0, 1) != 1)
{ {
throw new InvalidOperationException("No ongoing consuming operation to complete."); throw new InvalidOperationException("No ongoing consuming operation to complete.");
}
} }
} }