NetSharp

NetSharp.git
git clone git://git.lenczewski.org/NetSharp.git
Log | Files | Refs | README | LICENSE

commit 63bf1fa13f5031711615e048b48d86b9903032a6
parent 020e25c9b3b5e7172f0047787ce68b21814eeab4
Author: Mikolaj Lenczewski <mikolaj.lenczewski308@gmail.com>
Date:   Mon, 14 Sep 2020 11:13:32 +0100

Added AnalysisLevel option to NetSharp.csproj. Need to investigate memory corruption errors, probably related to Memory<T> and Span<T> (and ArrayPool<T>) usage.

Diffstat:
MNetSharp/NetSharp.Benchmarks/Program.cs | 2+-
MNetSharp/NetSharp.Tests/NetSharp.Tests.csproj | 4++--
MNetSharp/NetSharp/NetSharp.csproj | 7++-----
MNetSharp/NetSharp/Raw/Datagram/RawDatagramNetworkReader.cs | 18+-----------------
MNetSharp/NetSharp/Raw/RawNetworkConnectionBase.cs | 9++++++++-
MNetSharp/NetSharp/Raw/Stream/RawStreamNetworkReader.cs | 33++++-----------------------------
MNetSharp/NetSharp/Utils/SlimObjectPool.cs | 12+++++++-----
7 files changed, 25 insertions(+), 60 deletions(-)

diff --git a/NetSharp/NetSharp.Benchmarks/Program.cs b/NetSharp/NetSharp.Benchmarks/Program.cs @@ -116,7 +116,7 @@ namespace NetSharp.Benchmarks private static readonly IPAddress DefaultAddress = IPAddress.Loopback; #if DEBUG - public const int PacketSize = 4096, PacketCount = 100_000, ClientCount = 8; + public const int PacketSize = 4096, PacketCount = 10, ClientCount = 1; #else // RELEASE public const int PacketSize = 8192, PacketCount = 1_000_000, ClientCount = 10; #endif diff --git a/NetSharp/NetSharp.Tests/NetSharp.Tests.csproj b/NetSharp/NetSharp.Tests/NetSharp.Tests.csproj @@ -6,9 +6,9 @@ </PropertyGroup> <ItemGroup> - <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" /> + <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" /> <PackageReference Include="xunit" Version="2.4.1" /> - <PackageReference Include="xunit.runner.visualstudio" Version="2.4.2"> + <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> diff --git a/NetSharp/NetSharp/NetSharp.csproj b/NetSharp/NetSharp/NetSharp.csproj @@ -3,6 +3,7 @@ <PropertyGroup> <Nullable>enable</Nullable> <TargetFramework>netstandard2.1</TargetFramework> + <AnalysisLevel>latest</AnalysisLevel> <Configurations>Debug;Release</Configurations> </PropertyGroup> @@ -31,7 +32,7 @@ </PropertyGroup> <ItemGroup> - <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="3.0.0"> + <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="3.3.0"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> @@ -62,8 +63,4 @@ <LastGenOutput>Resources.Designer.cs</LastGenOutput> </EmbeddedResource> </ItemGroup> - - <ItemGroup> - <Folder Include="Packets\" /> - </ItemGroup> </Project> \ No newline at end of file diff --git a/NetSharp/NetSharp/Raw/Datagram/RawDatagramNetworkReader.cs b/NetSharp/NetSharp/Raw/Datagram/RawDatagramNetworkReader.cs @@ -95,6 +95,7 @@ namespace NetSharp.Raw.Datagram private void ConfigureAsyncReceiveFrom(SocketAsyncEventArgs args) { byte[] receiveBuffer = BufferPool.Rent(datagramSize); + args.SetBuffer(receiveBuffer, 0, datagramSize); } @@ -116,11 +117,6 @@ namespace NetSharp.Raw.Datagram private void StartDefaultReceiveFrom() { - if (ShutdownToken.IsCancellationRequested) - { - return; - } - SocketAsyncEventArgs args = ArgsPool.Rent(); ConfigureAsyncReceiveFrom(args); @@ -130,12 +126,6 @@ namespace NetSharp.Raw.Datagram private void StartReceiveFrom(SocketAsyncEventArgs args) { - if (ShutdownToken.IsCancellationRequested) - { - ArgsPool.Return(args); - return; - } - if (Connection.ReceiveFromAsync(args)) { return; @@ -147,12 +137,6 @@ namespace NetSharp.Raw.Datagram private void StartSendTo(SocketAsyncEventArgs args) { - if (ShutdownToken.IsCancellationRequested) - { - CleanupTransmissionBufferAndState(args); - return; - } - if (Connection.SendToAsync(args)) { return; diff --git a/NetSharp/NetSharp/Raw/RawNetworkConnectionBase.cs b/NetSharp/NetSharp/Raw/RawNetworkConnectionBase.cs @@ -72,7 +72,9 @@ namespace NetSharp.Raw // TODO implement pooling in better way for (uint i = 0; i < preallocatedStateObjects; i++) { +#pragma warning disable CA2214 // Nie wywołuj w konstruktorach metod, które można przesłaniać argsPool.Return(CreateStateObject()); +#pragma warning restore CA2214 // Nie wywołuj w konstruktorach metod, które można przesłaniać } } @@ -110,7 +112,12 @@ namespace NetSharp.Raw { if (args != default) { - bufferPool.Return(args.Buffer, true); + if (args.Buffer != default) + { + bufferPool.Return(args.Buffer, true); + args.SetBuffer(null, 0, 0); + } + argsPool.Return(args); } } diff --git a/NetSharp/NetSharp/Raw/Stream/RawStreamNetworkReader.cs b/NetSharp/NetSharp/Raw/Stream/RawStreamNetworkReader.cs @@ -54,8 +54,6 @@ namespace NetSharp.Raw.Stream private void CloseClientConnection(SocketAsyncEventArgs args) { - BufferPool.Return(args.Buffer, true); - Socket serversideClient = args.AcceptSocket; serversideClient.Disconnect(false); @@ -63,7 +61,7 @@ namespace NetSharp.Raw.Stream serversideClient.Close(); serversideClient.Dispose(); - ArgsPool.Return(args); + CleanupTransmissionBufferAndState(args); } private void CompleteAccept(SocketAsyncEventArgs args) @@ -84,7 +82,7 @@ namespace NetSharp.Raw.Stream break; default: - ArgsPool.Return(args); + CleanupTransmissionBufferAndState(args); break; } } @@ -149,7 +147,7 @@ namespace NetSharp.Raw.Stream case false: // we manually returns the response buffer, as it wasnt set to be the args.Buffer, and since we dont have a response packet we - // can reuse it as a packet header buffer in the below ConfigureReceiveHeader() call + // can reuse it as a packet header buffer in the below ConfigureAsyncReceiveHeader() call BufferPool.Return(responseBuffer, true); ConfigureAsyncReceiveHeader(args); @@ -285,11 +283,6 @@ namespace NetSharp.Raw.Stream private void StartAccept(SocketAsyncEventArgs args) { - if (ShutdownToken.IsCancellationRequested) - { - return; - } - if (Connection.AcceptAsync(args)) { return; @@ -301,23 +294,13 @@ namespace NetSharp.Raw.Stream private void StartDefaultAccept() { - if (ShutdownToken.IsCancellationRequested) - { - return; - } - SocketAsyncEventArgs args = ArgsPool.Rent(); + StartAccept(args); } private void StartOrContinueReceive(SocketAsyncEventArgs args) { - if (ShutdownToken.IsCancellationRequested) - { - CloseClientConnection(args); - return; - } - Socket serversideClient = args.AcceptSocket; if (serversideClient.ReceiveAsync(args)) @@ -330,12 +313,6 @@ namespace NetSharp.Raw.Stream private void StartOrContinueSend(SocketAsyncEventArgs args) { - if (ShutdownToken.IsCancellationRequested) - { - CloseClientConnection(args); - return; - } - Socket serversideClient = args.AcceptSocket; if (serversideClient.SendAsync(args)) @@ -371,8 +348,6 @@ namespace NetSharp.Raw.Stream /// <inheritdoc /> protected override void ResetStateObject(ref SocketAsyncEventArgs instance) { - instance.SetBuffer(null, 0, 0); - instance.AcceptSocket = null; } diff --git a/NetSharp/NetSharp/Utils/SlimObjectPool.cs b/NetSharp/NetSharp/Utils/SlimObjectPool.cs @@ -144,12 +144,14 @@ namespace NetSharp.Utils { resetObjectDelegate(ref instance); - bool couldRebuffer = false; + objectBuffer.TryAdd(instance); - while (!couldRebuffer) - { - couldRebuffer = objectBuffer.TryAdd(instance); - } + //bool couldRebuffer = false; + + //while (!couldRebuffer) + //{ + // couldRebuffer = objectBuffer.TryAdd(instance); + //} } else {