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:
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
{