From a1d75df47d763afb79906d0a526d9d918d2176d7 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Mon, 20 Nov 2017 11:36:09 -0800 Subject: [PATCH] Use new Memory APIs on SocketAsyncEventArgs (#2173) - This should improve the performance of handling buffers by (eventually) removing GCHandle churn for Kestrel's already pinned buffers. - Made the Sockets transport target both netcoreapp2.1 and netstandard2.0 to use new APIs - Disable API check for the sockets transport --- src/Kestrel.Transport.Sockets/Internal/SocketReceiver.cs | 5 ++++- src/Kestrel.Transport.Sockets/Internal/SocketSender.cs | 9 ++++++--- .../Kestrel.Transport.Sockets.csproj | 3 ++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/Kestrel.Transport.Sockets/Internal/SocketReceiver.cs b/src/Kestrel.Transport.Sockets/Internal/SocketReceiver.cs index ad3a99a0b0..0aff7d2cfd 100644 --- a/src/Kestrel.Transport.Sockets/Internal/SocketReceiver.cs +++ b/src/Kestrel.Transport.Sockets/Internal/SocketReceiver.cs @@ -21,10 +21,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal public SocketAwaitable ReceiveAsync(Memory buffer) { +#if NETCOREAPP2_1 + _eventArgs.SetBuffer(buffer); +#else var segment = buffer.GetArray(); _eventArgs.SetBuffer(segment.Array, segment.Offset, segment.Count); - +#endif if (!_socket.ReceiveAsync(_eventArgs)) { _awaitable.Complete(_eventArgs.BytesTransferred, _eventArgs.SocketError); diff --git a/src/Kestrel.Transport.Sockets/Internal/SocketSender.cs b/src/Kestrel.Transport.Sockets/Internal/SocketSender.cs index 365339aa50..688704811c 100644 --- a/src/Kestrel.Transport.Sockets/Internal/SocketSender.cs +++ b/src/Kestrel.Transport.Sockets/Internal/SocketSender.cs @@ -48,16 +48,19 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal private SocketAwaitable SendAsync(Memory buffer) { - var segment = buffer.GetArray(); - // The BufferList getter is much less expensive then the setter. if (_eventArgs.BufferList != null) { _eventArgs.BufferList = null; } - _eventArgs.SetBuffer(segment.Array, segment.Offset, segment.Count); +#if NETCOREAPP2_1 + _eventArgs.SetBuffer(buffer); +#else + var segment = buffer.GetArray(); + _eventArgs.SetBuffer(segment.Array, segment.Offset, segment.Count); +#endif if (!_socket.SendAsync(_eventArgs)) { _awaitable.Complete(_eventArgs.BytesTransferred, _eventArgs.SocketError); diff --git a/src/Kestrel.Transport.Sockets/Kestrel.Transport.Sockets.csproj b/src/Kestrel.Transport.Sockets/Kestrel.Transport.Sockets.csproj index 1674a1d65f..8e065c4828 100644 --- a/src/Kestrel.Transport.Sockets/Kestrel.Transport.Sockets.csproj +++ b/src/Kestrel.Transport.Sockets/Kestrel.Transport.Sockets.csproj @@ -4,11 +4,12 @@ Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets Managed socket transport for the ASP.NET Core Kestrel cross-platform web server. - netstandard2.0 + netstandard2.0;netcoreapp2.1 true aspnetcore;kestrel true CS1591;$(NoWarn) + false