Use pooled memory for filtered stream

This commit is contained in:
Ben Adams 2015-12-03 19:17:40 +00:00
parent 9af9dea72c
commit 1ca67695ed
2 changed files with 29 additions and 2 deletions

View File

@ -28,9 +28,13 @@ namespace Microsoft.AspNet.Server.Kestrel.Filter
_filteredStream = filteredStream;
_socketInputStream = new SocketInputStream(SocketInput);
// Don't use 81920 byte buffer
_filteredStream.CopyToAsync(_socketInputStream, 4096).ContinueWith((task, state) =>
var block = memory.Lease();
// Use pooled block for copy
_filteredStream.CopyToAsync(_socketInputStream, block).ContinueWith((task, state) =>
{
var returnedBlock = task.Result;
returnedBlock.Pool?.Return(returnedBlock);
((FilteredStreamAdapter)state).OnStreamClose(task);
}, this);
}

View File

@ -0,0 +1,23 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNet.Server.Kestrel.Infrastructure;
namespace Microsoft.AspNet.Server.Kestrel.Filter
{
public static class StreamExtensions
{
public static async Task<MemoryPoolBlock2> CopyToAsync(this Stream source, Stream destination, MemoryPoolBlock2 block)
{
int bytesRead;
while ((bytesRead = await source.ReadAsync(block.Array, block.Data.Offset, block.Data.Count)) != 0)
{
await destination.WriteAsync(block.Array, block.Data.Offset, bytesRead);
}
return block;
}
}
}