From 8fc779e9da5d26f2e77a22329136834a563f5c68 Mon Sep 17 00:00:00 2001 From: yaziciahmet Date: Thu, 30 Jun 2022 12:02:23 +0300 Subject: [PATCH 01/15] Added try-catch block while starting the watcherThread in ThreadDeathWatcher --- src/DotNetty.Common/ThreadDeathWatcher.cs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/DotNetty.Common/ThreadDeathWatcher.cs b/src/DotNetty.Common/ThreadDeathWatcher.cs index f043db77..e94d524c 100644 --- a/src/DotNetty.Common/ThreadDeathWatcher.cs +++ b/src/DotNetty.Common/ThreadDeathWatcher.cs @@ -59,10 +59,22 @@ static void Schedule(Thread thread, Action task, bool isWatch) if (Interlocked.CompareExchange(ref started, 1, 0) == 0) { - var watcherThread = new Thread(s => ((IRunnable)s).Run()); - watcherThread.IsBackground = true; - watcherThread.Start(watcher); - ThreadDeathWatcher.watcherThread = watcherThread; + try + { + var watcherThread = new Thread(s => ((IRunnable)s).Run()); + watcherThread.IsBackground = true; + watcherThread.Start(watcher); + ThreadDeathWatcher.watcherThread = watcherThread; + } + catch (Exception t) + { + Logger.Warn("Thread death watcher raised an exception while trying to start the thread:", t); + if (!watcherThread.IsAlive) + { + bool stopped = Interlocked.CompareExchange(ref started, 0, 1) == 1; + Contract.Assert(stopped); + } + } } } From c930c9e0ddd6406a502fecabeb4c66e03023a074 Mon Sep 17 00:00:00 2001 From: "lukasz.rozmej" Date: Tue, 12 Jul 2022 11:50:57 +0200 Subject: [PATCH 02/15] Catch exception in ThreadDeathWatcher background thread loop --- src/DotNetty.Common/ThreadDeathWatcher.cs | 87 ++++++++++++----------- 1 file changed, 46 insertions(+), 41 deletions(-) diff --git a/src/DotNetty.Common/ThreadDeathWatcher.cs b/src/DotNetty.Common/ThreadDeathWatcher.cs index e94d524c..516a457a 100644 --- a/src/DotNetty.Common/ThreadDeathWatcher.cs +++ b/src/DotNetty.Common/ThreadDeathWatcher.cs @@ -66,14 +66,10 @@ static void Schedule(Thread thread, Action task, bool isWatch) watcherThread.Start(watcher); ThreadDeathWatcher.watcherThread = watcherThread; } - catch (Exception t) + catch (Exception e) { - Logger.Warn("Thread death watcher raised an exception while trying to start the thread:", t); - if (!watcherThread.IsAlive) - { - bool stopped = Interlocked.CompareExchange(ref started, 0, 1) == 1; - Contract.Assert(stopped); - } + bool stopped = !watcherThread.IsAlive && Interlocked.CompareExchange(ref started, 0, 1) == 1; + Logger.Warn($"Thread death watcher stopped: {stopped} and raised an exception while trying to start the thread:", e); } } } @@ -107,48 +103,57 @@ sealed class Watcher : IRunnable public void Run() { - for (;;) + try { - this.FetchWatchees(); - this.NotifyWatchees(); - - // Try once again just in case notifyWatchees() triggered watch() or unwatch(). - this.FetchWatchees(); - this.NotifyWatchees(); + for (;;) + { + this.FetchWatchees(); + this.NotifyWatchees(); - Thread.Sleep(1000); + // Try once again just in case notifyWatchees() triggered watch() or unwatch(). + this.FetchWatchees(); + this.NotifyWatchees(); - if (this.watchees.Count == 0 && PendingEntries.IsEmpty) - { - // Mark the current worker thread as stopped. - // The following CAS must always success and must be uncontended, - // because only one watcher thread should be running at the same time. - bool stopped = Interlocked.CompareExchange(ref started, 0, 1) == 1; - Contract.Assert(stopped); - - // Check if there are pending entries added by watch() while we do CAS above. - if (PendingEntries.IsEmpty) - { - // A) watch() was not invoked and thus there's nothing to handle - // -> safe to terminate because there's nothing left to do - // B) a new watcher thread started and handled them all - // -> safe to terminate the new watcher thread will take care the rest - break; - } + Thread.Sleep(1000); - // There are pending entries again, added by watch() - if (Interlocked.CompareExchange(ref started, 1, 0) != 0) + if (this.watchees.Count == 0 && PendingEntries.IsEmpty) { - // watch() started a new watcher thread and set 'started' to true. - // -> terminate this thread so that the new watcher reads from pendingEntries exclusively. - break; + // Mark the current worker thread as stopped. + // The following CAS must always success and must be uncontended, + // because only one watcher thread should be running at the same time. + bool stopped = Interlocked.CompareExchange(ref started, 0, 1) == 1; + Contract.Assert(stopped); + + // Check if there are pending entries added by watch() while we do CAS above. + if (PendingEntries.IsEmpty) + { + // A) watch() was not invoked and thus there's nothing to handle + // -> safe to terminate because there's nothing left to do + // B) a new watcher thread started and handled them all + // -> safe to terminate the new watcher thread will take care the rest + break; + } + + // There are pending entries again, added by watch() + if (Interlocked.CompareExchange(ref started, 1, 0) != 0) + { + // watch() started a new watcher thread and set 'started' to true. + // -> terminate this thread so that the new watcher reads from pendingEntries exclusively. + break; + } + + // watch() added an entry, but this worker was faster to set 'started' to true. + // i.e. a new watcher thread was not started + // -> keep this thread alive to handle the newly added entries. } - - // watch() added an entry, but this worker was faster to set 'started' to true. - // i.e. a new watcher thread was not started - // -> keep this thread alive to handle the newly added entries. } } + catch (Exception e) + { + // unexpected event, try mark thread as stopped + bool stopped = Interlocked.CompareExchange(ref started, 0, 1) == 1; + Logger.Error($"Thread death watcher was stopped: {stopped} and raised an fatal exception while processing:", e); + } } void FetchWatchees() From 207c16fd0d6dea98549b606584b5a824091af156 Mon Sep 17 00:00:00 2001 From: Ruben Buniatyan Date: Thu, 25 Aug 2022 20:40:28 +0200 Subject: [PATCH 03/15] Configure packaging --- src/Directory.Build.props | 24 +++++++++++---- src/DotNetty.Buffers/DotNetty.Buffers.csproj | 23 +++++++++++---- .../DotNetty.Codecs.Http.csproj | 23 +++++++++++---- .../DotNetty.Codecs.Mqtt.csproj | 29 ++++++++++++++----- .../DotNetty.Codecs.Protobuf.csproj | 26 ++++++++++++----- .../DotNetty.Codecs.ProtocolBuffers.csproj | 23 +++++++++++---- .../DotNetty.Codecs.Redis.csproj | 26 +++++++++++++---- src/DotNetty.Codecs/DotNetty.Codecs.csproj | 23 +++++++++++---- src/DotNetty.Common/DotNetty.Common.csproj | 23 +++++++++++---- .../DotNetty.Handlers.csproj | 26 +++++++++++++---- .../DotNetty.Transport.Libuv.csproj | 25 +++++++++++----- .../DotNetty.Transport.csproj | 26 +++++++++++++---- src/shared/SharedAssemblyInfo.cs | 5 ++-- 13 files changed, 224 insertions(+), 78 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index d7ac8051..9e6fd0f1 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -5,19 +5,31 @@ Debug;Release;Package AnyCPU true - pdbonly + + pdbonly true $(SolutionDir)build_output\packages True true - - 0.7.5 + + 0.7.5-preview.1 $(PackageVersion) - + + + Nethermind, Microsoft + Demerzel Solutions Limited, Microsoft Corporation + true + MIT + https://github.com/nethermindeth/dotnetty + git + https://github.com/nethermindeth/dotnetty + true + snupkg + + diff --git a/src/DotNetty.Buffers/DotNetty.Buffers.csproj b/src/DotNetty.Buffers/DotNetty.Buffers.csproj index 46bdfdec..987b4120 100644 --- a/src/DotNetty.Buffers/DotNetty.Buffers.csproj +++ b/src/DotNetty.Buffers/DotNetty.Buffers.csproj @@ -2,12 +2,12 @@ netstandard2.0;net472;net5.0;net6.0 true - Buffer management in DotNetty - © Microsoft Corporation. All rights reserved. + DotNetty: buffer management en-US - 0.7.5 - Microsoft + $(NoWarn);CS1591 True false @@ -16,18 +16,29 @@ ../../DotNetty.snk true true - DotNetty.Buffers + 2.0.3 + + + Buffer management in DotNetty + Nethermind.DotNetty.Buffers + socket tcp protocol netty dotnetty network + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/src/DotNetty.Codecs.Http/DotNetty.Codecs.Http.csproj b/src/DotNetty.Codecs.Http/DotNetty.Codecs.Http.csproj index ab139659..b8d411268 100644 --- a/src/DotNetty.Codecs.Http/DotNetty.Codecs.Http.csproj +++ b/src/DotNetty.Codecs.Http/DotNetty.Codecs.Http.csproj @@ -3,13 +3,13 @@ netstandard2.0;net472;net5.0;net6.0 true - DotNetty.Codecs.Http + DotNetty: Http codec en-US - 0.7.5 - Microsoft + $(NoWarn);CS1591 true false @@ -18,18 +18,29 @@ ../../DotNetty.snk true true - socket;tcp;protocol;netty;dotnetty;network;http + 2.0.3 + + + Http codec for DotNetty + Nethermind.DotNetty.Codecs.Http + socket tcp protocol netty dotnetty network http + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/src/DotNetty.Codecs.Mqtt/DotNetty.Codecs.Mqtt.csproj b/src/DotNetty.Codecs.Mqtt/DotNetty.Codecs.Mqtt.csproj index a6cd947e..f7675cb2 100644 --- a/src/DotNetty.Codecs.Mqtt/DotNetty.Codecs.Mqtt.csproj +++ b/src/DotNetty.Codecs.Mqtt/DotNetty.Codecs.Mqtt.csproj @@ -1,14 +1,15 @@ - + + netstandard2.0;net472;net5.0;net6.0 true - DotNetty.Codecs.Mqtt + DotNetty: MQTT codec en-US - 0.7.5 - Microsoft + $(NoWarn);CS1591 false true @@ -16,17 +17,31 @@ ../../DotNetty.snk true true - socket;tcp;protocol;netty;dotnetty;network;mqtt + 2.0.3 + + + MQTT codec for DotNetty + Nethermind.DotNetty.Codecs.Mqtt + socket tcp protocol netty dotnetty network mqtt + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/src/DotNetty.Codecs.Protobuf/DotNetty.Codecs.Protobuf.csproj b/src/DotNetty.Codecs.Protobuf/DotNetty.Codecs.Protobuf.csproj index 1f54e068..c027351e 100644 --- a/src/DotNetty.Codecs.Protobuf/DotNetty.Codecs.Protobuf.csproj +++ b/src/DotNetty.Codecs.Protobuf/DotNetty.Codecs.Protobuf.csproj @@ -1,14 +1,15 @@ - + + netstandard2.0;net472;net5.0;net6.0 true - DotNetty.Codecs.Protobuf + DotNetty: Protobuf Proto3 codec en-US - 0.7.5 - Microsoft + $(NoWarn);CS1591 false true @@ -16,14 +17,21 @@ ../../DotNetty.snk true true - socket;tcp;protocol;netty;dotnetty;network;Protobuf + 2.0.3 + + + Protobuf Proto3 codec for DotNetty + Nethermind.DotNetty.Codecs.Protobuf + socket tcp protocol netty dotnetty network protobuf + + @@ -35,5 +43,9 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + \ No newline at end of file diff --git a/src/DotNetty.Codecs.ProtocolBuffers/DotNetty.Codecs.ProtocolBuffers.csproj b/src/DotNetty.Codecs.ProtocolBuffers/DotNetty.Codecs.ProtocolBuffers.csproj index 56ec11f3..82a26908 100644 --- a/src/DotNetty.Codecs.ProtocolBuffers/DotNetty.Codecs.ProtocolBuffers.csproj +++ b/src/DotNetty.Codecs.ProtocolBuffers/DotNetty.Codecs.ProtocolBuffers.csproj @@ -3,13 +3,13 @@ netstandard2.0;net472;net5.0;net6.0 true - DotNetty.Codecs.ProtocolBuffers + DotNetty: ProtocolBuffers Proto2 codec en-US - 0.7.5 - Microsoft + $(NoWarn);CS1591 false true @@ -17,14 +17,21 @@ ../../DotNetty.snk true true - socket;tcp;protocol;netty;dotnetty;network;ProtocolBuffers + 2.0.3 + + + ProtocolBuffers Proto2 codec for DotNetty + Nethermind.DotNetty.Codecs.ProtocolBuffers + socket tcp protocol netty dotnetty network protocolbuffers + + @@ -36,5 +43,9 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + \ No newline at end of file diff --git a/src/DotNetty.Codecs.Redis/DotNetty.Codecs.Redis.csproj b/src/DotNetty.Codecs.Redis/DotNetty.Codecs.Redis.csproj index ad07b19b..2202de52 100644 --- a/src/DotNetty.Codecs.Redis/DotNetty.Codecs.Redis.csproj +++ b/src/DotNetty.Codecs.Redis/DotNetty.Codecs.Redis.csproj @@ -2,13 +2,13 @@ netstandard2.0;net472;net5.0;net6.0 true - DotNetty.Codecs.Redis + DotNetty: Redis codec en-US - 0.7.5 - Microsoft + $(NoWarn);CS1591 false true @@ -16,17 +16,31 @@ ../../DotNetty.snk true true - socket;tcp;protocol;netty;dotnetty;network;redis + 2.0.3 + + + Redis codec for DotNetty + Nethermind.DotNetty.Codecs.Redis + socket tcp protocol netty dotnetty network redis + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/src/DotNetty.Codecs/DotNetty.Codecs.csproj b/src/DotNetty.Codecs/DotNetty.Codecs.csproj index abf2ee2f..15ebda18 100644 --- a/src/DotNetty.Codecs/DotNetty.Codecs.csproj +++ b/src/DotNetty.Codecs/DotNetty.Codecs.csproj @@ -2,13 +2,13 @@ netstandard2.0;net472;net5.0;net6.0 true - DotNetty.Codecs + DotNetty: codecs en-US - 0.7.5 - Microsoft + $(NoWarn);CS1591 true false @@ -17,19 +17,30 @@ ../../DotNetty.snk true true - DotNetty.Codecs + 2.0.3 + + + General purpose codecs for DotNetty + Nethermind.DotNetty.Codecs + socket tcp protocol netty dotnetty network codec + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/src/DotNetty.Common/DotNetty.Common.csproj b/src/DotNetty.Common/DotNetty.Common.csproj index be454f87..d0b30213 100644 --- a/src/DotNetty.Common/DotNetty.Common.csproj +++ b/src/DotNetty.Common/DotNetty.Common.csproj @@ -3,13 +3,13 @@ netstandard2.0;net472;net5.0;net6.0 true - DotNetty.Common + DotNetty: common routines en-US - 0.7.5 - Microsoft + $(NoWarn);CS1591 True false @@ -18,19 +18,30 @@ ../../DotNetty.snk true true - socket;tcp;protocol;netty;dotnetty;network + 2.0.3 + + + DotNetty common routines + Nethermind.DotNetty.Common + socket tcp protocol netty dotnetty network + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + \ No newline at end of file diff --git a/src/DotNetty.Handlers/DotNetty.Handlers.csproj b/src/DotNetty.Handlers/DotNetty.Handlers.csproj index 45b22e99..f0d58587 100644 --- a/src/DotNetty.Handlers/DotNetty.Handlers.csproj +++ b/src/DotNetty.Handlers/DotNetty.Handlers.csproj @@ -3,13 +3,13 @@ netstandard2.0;net472;net5.0;net6.0 true - DotNetty.Handlers + DotNetty: handlers en-US - 0.7.5 - Microsoft + $(NoWarn);CS1591 false true @@ -17,17 +17,31 @@ ../../DotNetty.snk true true - socket;tcp;protocol;netty;dotnetty;network;tls;ssl + 2.0.3 + + + Application handlers for DotNetty + Nethermind.DotNetty.Handlers + socket tcp protocol netty dotnetty network tls ssl + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/src/DotNetty.Transport.Libuv/DotNetty.Transport.Libuv.csproj b/src/DotNetty.Transport.Libuv/DotNetty.Transport.Libuv.csproj index 298de42e..d858c396 100644 --- a/src/DotNetty.Transport.Libuv/DotNetty.Transport.Libuv.csproj +++ b/src/DotNetty.Transport.Libuv/DotNetty.Transport.Libuv.csproj @@ -1,15 +1,16 @@ - + + netstandard2.0;net472;net5.0;net6.0 true - DotNetty.Transport.Libuv + DotNetty: libuv transport model Experimental en-US - 0.7.5 - Microsoft + $(NoWarn);CS1591 True false @@ -18,21 +19,31 @@ ../../DotNetty.snk true true - socket;tcp;udp;protocol;netty;dotnetty;network + 2.0.3 + + Libuv transport model in DotNetty + Nethermind.DotNetty.Transport.Libuv + socket tcp udp protocol netty dotnetty network + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/src/DotNetty.Transport/DotNetty.Transport.csproj b/src/DotNetty.Transport/DotNetty.Transport.csproj index 5a05de57..d98489b7 100644 --- a/src/DotNetty.Transport/DotNetty.Transport.csproj +++ b/src/DotNetty.Transport/DotNetty.Transport.csproj @@ -3,13 +3,13 @@ netstandard2.0;net472;net5.0;net6.0 true - DotNetty.Transport + DotNetty: transport model en-US - 0.7.5 - Microsoft + $(NoWarn);CS1591 false true @@ -17,17 +17,31 @@ ../../DotNetty.snk true true - socket;tcp;udp;protocol;netty;dotnetty;network + 2.0.3 + + + Transport model in DotNetty + Nethermind.DotNetty.Transport + socket tcp udp protocol netty dotnetty network + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/src/shared/SharedAssemblyInfo.cs b/src/shared/SharedAssemblyInfo.cs index 9d7d6556..753187bb 100644 --- a/src/shared/SharedAssemblyInfo.cs +++ b/src/shared/SharedAssemblyInfo.cs @@ -5,9 +5,8 @@ //------------------------------------------------------------------------------ using System.Reflection; -[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyCompany("Nethermind, Microsoft")] [assembly: AssemblyProduct("DotNetty")] [assembly: AssemblyVersion("0.7.5")] [assembly: AssemblyFileVersion("0.7.5")] -[assembly: AssemblyCopyright("(c) Microsoft 2015 - 2021")] - +[assembly: AssemblyCopyright("Demerzel Solutions Limited, Microsoft Corporation")] From aefda19115224d4a7692a01f71cbcaca14e0523e Mon Sep 17 00:00:00 2001 From: Ruben Buniatyan Date: Thu, 25 Aug 2022 20:42:31 +0200 Subject: [PATCH 04/15] Remove examples from the solution --- DotNetty.sln | 220 ++++++++++----------------------------------------- 1 file changed, 41 insertions(+), 179 deletions(-) diff --git a/DotNetty.sln b/DotNetty.sln index 5077ced5..c9dc8be9 100644 --- a/DotNetty.sln +++ b/DotNetty.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2024 +# Visual Studio Version 17 +VisualStudioVersion = 17.3.32819.101 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{F5B1CA65-5852-41C6-9D6F-184A3889237B}" ProjectSection(SolutionItems) = preProject @@ -10,8 +10,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{F5B1CA65 build.sh = build.sh EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{F716F1EF-81EF-4020-914A-5422A13A9E13}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "shared", "shared", "{036F5A7D-2B05-4DE5-9AD8-45162E2F0645}" ProjectSection(SolutionItems) = preProject shared\dotnetty.com.pfx = shared\dotnetty.com.pfx @@ -63,283 +61,164 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetty.Transport.Tests", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetty.Transport.Tests.Performance", "test\DotNetty.Transport.Tests.Performance\DotNetty.Transport.Tests.Performance.csproj", "{3DA49C12-3614-40F5-B5CE-8B95F872EFC1}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discard.Client", "examples\Discard.Client\Discard.Client.csproj", "{9AE188E0-F328-4A88-AF5F-CE0C1D4D0036}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Examples.Common", "examples\Examples.Common\Examples.Common.csproj", "{66491D47-2BFB-45CF-A582-C11860219512}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discard.Server", "examples\Discard.Server\Discard.Server.csproj", "{664ECD06-26EB-4F8F-8D88-5444A5E766E0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Echo.Client", "examples\Echo.Client\Echo.Client.csproj", "{EAE5000B-9A97-4308-B791-0B71DE0A8219}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Echo.Server", "examples\Echo.Server\Echo.Server.csproj", "{E854F61B-548A-4100-A766-35B972B9EE11}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Factorial", "examples\Factorial\Factorial.csproj", "{22C53CFB-B54A-438E-820F-42C94D557345}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Factorial.Client", "examples\Factorial.Client\Factorial.Client.csproj", "{A4E85E94-383F-40EA-9478-0545070E52F5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Factorial.Server", "examples\Factorial.Server\Factorial.Server.csproj", "{928090A9-AAC7-496C-A8E3-D242D2D8BC74}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "QuoteOfTheMoment.Client", "examples\QuoteOfTheMoment.Client\QuoteOfTheMoment.Client.csproj", "{D69B9924-5C2E-41BC-9354-A12DA7D03FDF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "QuoteOfTheMoment.Server", "examples\QuoteOfTheMoment.Server\QuoteOfTheMoment.Server.csproj", "{ED307D87-E1BF-49B6-9591-5250D431C758}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SecureChat.Client", "examples\SecureChat.Client\SecureChat.Client.csproj", "{0E4B622A-063B-4A39-87CF-F18AEACBDDC5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SecureChat.Server", "examples\SecureChat.Server\SecureChat.Server.csproj", "{E2BEAAAE-497B-49F4-AD27-03BE20924311}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Telnet.Client", "examples\Telnet.Client\Telnet.Client.csproj", "{F2490822-51F7-4B65-8B21-EE0082B76745}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Telnet.Server", "examples\Telnet.Server\Telnet.Server.csproj", "{07C97A77-61B6-4BB5-9436-3A7FC379B75E}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetty.Microbench", "test\DotNetty.Microbench\DotNetty.Microbench.csproj", "{7155D1E6-00CE-4081-B922-E6C5524EE600}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetty.Transport.Libuv", "src\DotNetty.Transport.Libuv\DotNetty.Transport.Libuv.csproj", "{9FE6A783-C20D-4097-9988-4178E2C4CE75}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetty.Transport.Libuv.Tests", "test\DotNetty.Transport.Libuv.Tests\DotNetty.Transport.Libuv.Tests.csproj", "{1012C962-7F6D-4EC5-A0EC-0741A95BAD6B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HttpServer", "examples\HttpServer\HttpServer.csproj", "{A7CACAE7-66E7-43DA-948B-28EB0DDDB582}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetty.Codecs.Http", "src\DotNetty.Codecs.Http\DotNetty.Codecs.Http.csproj", "{5F68A5B1-7907-4B16-8AFE-326E9DD7D65B}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetty.Codecs.Http.Tests", "test\DotNetty.Codecs.Http.Tests\DotNetty.Codecs.Http.Tests.csproj", "{16C89E7C-1575-4685-8DFA-8E7E2C6101BF}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebSockets.Server", "examples\WebSockets.Server\WebSockets.Server.csproj", "{EA387B4B-DAD0-4E34-B8A3-79EA4616726A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebSockets.Client", "examples\WebSockets.Client\WebSockets.Client.csproj", "{3326DB6E-023E-483F-9A1C-5905D3091B57}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU Package|Any CPU = Package|Any CPU + Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {DF4FF0D0-A5CE-471F-B946-538C28C21CBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DF4FF0D0-A5CE-471F-B946-538C28C21CBB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DF4FF0D0-A5CE-471F-B946-538C28C21CBB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DF4FF0D0-A5CE-471F-B946-538C28C21CBB}.Release|Any CPU.Build.0 = Release|Any CPU {DF4FF0D0-A5CE-471F-B946-538C28C21CBB}.Package|Any CPU.ActiveCfg = Package|Any CPU {DF4FF0D0-A5CE-471F-B946-538C28C21CBB}.Package|Any CPU.Build.0 = Package|Any CPU + {DF4FF0D0-A5CE-471F-B946-538C28C21CBB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DF4FF0D0-A5CE-471F-B946-538C28C21CBB}.Release|Any CPU.Build.0 = Release|Any CPU {64508DA2-40F1-4CC3-93E8-EA3B18A64E7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {64508DA2-40F1-4CC3-93E8-EA3B18A64E7E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {64508DA2-40F1-4CC3-93E8-EA3B18A64E7E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {64508DA2-40F1-4CC3-93E8-EA3B18A64E7E}.Release|Any CPU.Build.0 = Release|Any CPU {64508DA2-40F1-4CC3-93E8-EA3B18A64E7E}.Package|Any CPU.ActiveCfg = Package|Any CPU {64508DA2-40F1-4CC3-93E8-EA3B18A64E7E}.Package|Any CPU.Build.0 = Package|Any CPU + {64508DA2-40F1-4CC3-93E8-EA3B18A64E7E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {64508DA2-40F1-4CC3-93E8-EA3B18A64E7E}.Release|Any CPU.Build.0 = Release|Any CPU {82796E9E-1331-4858-90C3-8E74BA4CC383}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {82796E9E-1331-4858-90C3-8E74BA4CC383}.Debug|Any CPU.Build.0 = Debug|Any CPU - {82796E9E-1331-4858-90C3-8E74BA4CC383}.Release|Any CPU.ActiveCfg = Release|Any CPU - {82796E9E-1331-4858-90C3-8E74BA4CC383}.Release|Any CPU.Build.0 = Release|Any CPU {82796E9E-1331-4858-90C3-8E74BA4CC383}.Package|Any CPU.ActiveCfg = Package|Any CPU {82796E9E-1331-4858-90C3-8E74BA4CC383}.Package|Any CPU.Build.0 = Package|Any CPU + {82796E9E-1331-4858-90C3-8E74BA4CC383}.Release|Any CPU.ActiveCfg = Release|Any CPU + {82796E9E-1331-4858-90C3-8E74BA4CC383}.Release|Any CPU.Build.0 = Release|Any CPU {25F7AD69-7836-46E8-9B29-0FBB3C128FFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {25F7AD69-7836-46E8-9B29-0FBB3C128FFB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {25F7AD69-7836-46E8-9B29-0FBB3C128FFB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {25F7AD69-7836-46E8-9B29-0FBB3C128FFB}.Release|Any CPU.Build.0 = Release|Any CPU {25F7AD69-7836-46E8-9B29-0FBB3C128FFB}.Package|Any CPU.ActiveCfg = Package|Any CPU {25F7AD69-7836-46E8-9B29-0FBB3C128FFB}.Package|Any CPU.Build.0 = Package|Any CPU + {25F7AD69-7836-46E8-9B29-0FBB3C128FFB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {25F7AD69-7836-46E8-9B29-0FBB3C128FFB}.Release|Any CPU.Build.0 = Release|Any CPU {12DCCEFD-623B-46CC-979C-407FA265E239}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {12DCCEFD-623B-46CC-979C-407FA265E239}.Debug|Any CPU.Build.0 = Debug|Any CPU - {12DCCEFD-623B-46CC-979C-407FA265E239}.Release|Any CPU.ActiveCfg = Release|Any CPU - {12DCCEFD-623B-46CC-979C-407FA265E239}.Release|Any CPU.Build.0 = Release|Any CPU {12DCCEFD-623B-46CC-979C-407FA265E239}.Package|Any CPU.ActiveCfg = Package|Any CPU {12DCCEFD-623B-46CC-979C-407FA265E239}.Package|Any CPU.Build.0 = Package|Any CPU + {12DCCEFD-623B-46CC-979C-407FA265E239}.Release|Any CPU.ActiveCfg = Release|Any CPU + {12DCCEFD-623B-46CC-979C-407FA265E239}.Release|Any CPU.Build.0 = Release|Any CPU {5ADB0FF5-8EFC-475A-BF08-6B35EF728329}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5ADB0FF5-8EFC-475A-BF08-6B35EF728329}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5ADB0FF5-8EFC-475A-BF08-6B35EF728329}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5ADB0FF5-8EFC-475A-BF08-6B35EF728329}.Release|Any CPU.Build.0 = Release|Any CPU {5ADB0FF5-8EFC-475A-BF08-6B35EF728329}.Package|Any CPU.ActiveCfg = Package|Any CPU {5ADB0FF5-8EFC-475A-BF08-6B35EF728329}.Package|Any CPU.Build.0 = Package|Any CPU + {5ADB0FF5-8EFC-475A-BF08-6B35EF728329}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5ADB0FF5-8EFC-475A-BF08-6B35EF728329}.Release|Any CPU.Build.0 = Release|Any CPU {D284C2BF-E06E-481B-B301-503A9D477B0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D284C2BF-E06E-481B-B301-503A9D477B0E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D284C2BF-E06E-481B-B301-503A9D477B0E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D284C2BF-E06E-481B-B301-503A9D477B0E}.Release|Any CPU.Build.0 = Release|Any CPU {D284C2BF-E06E-481B-B301-503A9D477B0E}.Package|Any CPU.ActiveCfg = Package|Any CPU {D284C2BF-E06E-481B-B301-503A9D477B0E}.Package|Any CPU.Build.0 = Package|Any CPU + {D284C2BF-E06E-481B-B301-503A9D477B0E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D284C2BF-E06E-481B-B301-503A9D477B0E}.Release|Any CPU.Build.0 = Release|Any CPU {75A1BCC1-A7F3-4893-99C5-3235F87DB00E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {75A1BCC1-A7F3-4893-99C5-3235F87DB00E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {75A1BCC1-A7F3-4893-99C5-3235F87DB00E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {75A1BCC1-A7F3-4893-99C5-3235F87DB00E}.Release|Any CPU.Build.0 = Release|Any CPU {75A1BCC1-A7F3-4893-99C5-3235F87DB00E}.Package|Any CPU.ActiveCfg = Package|Any CPU {75A1BCC1-A7F3-4893-99C5-3235F87DB00E}.Package|Any CPU.Build.0 = Package|Any CPU + {75A1BCC1-A7F3-4893-99C5-3235F87DB00E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {75A1BCC1-A7F3-4893-99C5-3235F87DB00E}.Release|Any CPU.Build.0 = Release|Any CPU {1F442118-A665-4891-B056-FE9E54C5B049}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1F442118-A665-4891-B056-FE9E54C5B049}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1F442118-A665-4891-B056-FE9E54C5B049}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1F442118-A665-4891-B056-FE9E54C5B049}.Release|Any CPU.Build.0 = Release|Any CPU {1F442118-A665-4891-B056-FE9E54C5B049}.Package|Any CPU.ActiveCfg = Package|Any CPU {1F442118-A665-4891-B056-FE9E54C5B049}.Package|Any CPU.Build.0 = Package|Any CPU + {1F442118-A665-4891-B056-FE9E54C5B049}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1F442118-A665-4891-B056-FE9E54C5B049}.Release|Any CPU.Build.0 = Release|Any CPU {572E1914-489F-402D-944F-71EE0632E5D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {572E1914-489F-402D-944F-71EE0632E5D8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {572E1914-489F-402D-944F-71EE0632E5D8}.Package|Any CPU.ActiveCfg = Package|Any CPU {572E1914-489F-402D-944F-71EE0632E5D8}.Release|Any CPU.ActiveCfg = Release|Any CPU {572E1914-489F-402D-944F-71EE0632E5D8}.Release|Any CPU.Build.0 = Release|Any CPU - {572E1914-489F-402D-944F-71EE0632E5D8}.Package|Any CPU.ActiveCfg = Package|Any CPU {DA54DBAF-CCDA-4AD1-9FF9-EB6F890D1091}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DA54DBAF-CCDA-4AD1-9FF9-EB6F890D1091}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DA54DBAF-CCDA-4AD1-9FF9-EB6F890D1091}.Package|Any CPU.ActiveCfg = Package|Any CPU {DA54DBAF-CCDA-4AD1-9FF9-EB6F890D1091}.Release|Any CPU.ActiveCfg = Release|Any CPU {DA54DBAF-CCDA-4AD1-9FF9-EB6F890D1091}.Release|Any CPU.Build.0 = Release|Any CPU - {DA54DBAF-CCDA-4AD1-9FF9-EB6F890D1091}.Package|Any CPU.ActiveCfg = Package|Any CPU {72C92F76-F804-4300-BFF1-459420D9EF0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {72C92F76-F804-4300-BFF1-459420D9EF0B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {72C92F76-F804-4300-BFF1-459420D9EF0B}.Package|Any CPU.ActiveCfg = Package|Any CPU {72C92F76-F804-4300-BFF1-459420D9EF0B}.Release|Any CPU.ActiveCfg = Release|Any CPU {72C92F76-F804-4300-BFF1-459420D9EF0B}.Release|Any CPU.Build.0 = Release|Any CPU - {72C92F76-F804-4300-BFF1-459420D9EF0B}.Package|Any CPU.ActiveCfg = Package|Any CPU {E31A5D46-71B7-4B7E-A9F8-3F011822F28A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E31A5D46-71B7-4B7E-A9F8-3F011822F28A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E31A5D46-71B7-4B7E-A9F8-3F011822F28A}.Package|Any CPU.ActiveCfg = Package|Any CPU {E31A5D46-71B7-4B7E-A9F8-3F011822F28A}.Release|Any CPU.ActiveCfg = Release|Any CPU {E31A5D46-71B7-4B7E-A9F8-3F011822F28A}.Release|Any CPU.Build.0 = Release|Any CPU - {E31A5D46-71B7-4B7E-A9F8-3F011822F28A}.Package|Any CPU.ActiveCfg = Package|Any CPU {3AF8A62F-F5CE-4C2D-B356-8B9FDFA51668}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3AF8A62F-F5CE-4C2D-B356-8B9FDFA51668}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3AF8A62F-F5CE-4C2D-B356-8B9FDFA51668}.Package|Any CPU.ActiveCfg = Package|Any CPU {3AF8A62F-F5CE-4C2D-B356-8B9FDFA51668}.Release|Any CPU.ActiveCfg = Release|Any CPU {3AF8A62F-F5CE-4C2D-B356-8B9FDFA51668}.Release|Any CPU.Build.0 = Release|Any CPU - {3AF8A62F-F5CE-4C2D-B356-8B9FDFA51668}.Package|Any CPU.ActiveCfg = Package|Any CPU {A7FC497E-790A-4980-B57C-32AF4AD4AB9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A7FC497E-790A-4980-B57C-32AF4AD4AB9D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A7FC497E-790A-4980-B57C-32AF4AD4AB9D}.Package|Any CPU.ActiveCfg = Package|Any CPU {A7FC497E-790A-4980-B57C-32AF4AD4AB9D}.Release|Any CPU.ActiveCfg = Release|Any CPU {A7FC497E-790A-4980-B57C-32AF4AD4AB9D}.Release|Any CPU.Build.0 = Release|Any CPU - {A7FC497E-790A-4980-B57C-32AF4AD4AB9D}.Package|Any CPU.ActiveCfg = Package|Any CPU {08C19033-23B2-47D7-8332-86273AE287BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {08C19033-23B2-47D7-8332-86273AE287BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {08C19033-23B2-47D7-8332-86273AE287BC}.Package|Any CPU.ActiveCfg = Package|Any CPU {08C19033-23B2-47D7-8332-86273AE287BC}.Release|Any CPU.ActiveCfg = Release|Any CPU {08C19033-23B2-47D7-8332-86273AE287BC}.Release|Any CPU.Build.0 = Release|Any CPU - {08C19033-23B2-47D7-8332-86273AE287BC}.Package|Any CPU.ActiveCfg = Package|Any CPU {CE97D2EC-3EA9-4FEC-B304-F57646DB54FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CE97D2EC-3EA9-4FEC-B304-F57646DB54FD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CE97D2EC-3EA9-4FEC-B304-F57646DB54FD}.Package|Any CPU.ActiveCfg = Package|Any CPU {CE97D2EC-3EA9-4FEC-B304-F57646DB54FD}.Release|Any CPU.ActiveCfg = Release|Any CPU {CE97D2EC-3EA9-4FEC-B304-F57646DB54FD}.Release|Any CPU.Build.0 = Release|Any CPU - {CE97D2EC-3EA9-4FEC-B304-F57646DB54FD}.Package|Any CPU.ActiveCfg = Package|Any CPU {D0DBB346-BDDA-4E28-A335-6D3E1F9902DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D0DBB346-BDDA-4E28-A335-6D3E1F9902DF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D0DBB346-BDDA-4E28-A335-6D3E1F9902DF}.Package|Any CPU.ActiveCfg = Package|Any CPU {D0DBB346-BDDA-4E28-A335-6D3E1F9902DF}.Release|Any CPU.ActiveCfg = Release|Any CPU {D0DBB346-BDDA-4E28-A335-6D3E1F9902DF}.Release|Any CPU.Build.0 = Release|Any CPU - {D0DBB346-BDDA-4E28-A335-6D3E1F9902DF}.Package|Any CPU.ActiveCfg = Package|Any CPU {5D5A3137-F118-4F6C-ABE7-2523184A3A2D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5D5A3137-F118-4F6C-ABE7-2523184A3A2D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5D5A3137-F118-4F6C-ABE7-2523184A3A2D}.Package|Any CPU.ActiveCfg = Package|Any CPU {5D5A3137-F118-4F6C-ABE7-2523184A3A2D}.Release|Any CPU.ActiveCfg = Release|Any CPU {5D5A3137-F118-4F6C-ABE7-2523184A3A2D}.Release|Any CPU.Build.0 = Release|Any CPU - {5D5A3137-F118-4F6C-ABE7-2523184A3A2D}.Package|Any CPU.ActiveCfg = Package|Any CPU {BDA099C5-E435-49DF-9922-58D63E11B764}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BDA099C5-E435-49DF-9922-58D63E11B764}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BDA099C5-E435-49DF-9922-58D63E11B764}.Package|Any CPU.ActiveCfg = Package|Any CPU {BDA099C5-E435-49DF-9922-58D63E11B764}.Release|Any CPU.ActiveCfg = Release|Any CPU {BDA099C5-E435-49DF-9922-58D63E11B764}.Release|Any CPU.Build.0 = Release|Any CPU - {BDA099C5-E435-49DF-9922-58D63E11B764}.Package|Any CPU.ActiveCfg = Package|Any CPU {3DA49C12-3614-40F5-B5CE-8B95F872EFC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3DA49C12-3614-40F5-B5CE-8B95F872EFC1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3DA49C12-3614-40F5-B5CE-8B95F872EFC1}.Package|Any CPU.ActiveCfg = Package|Any CPU {3DA49C12-3614-40F5-B5CE-8B95F872EFC1}.Release|Any CPU.ActiveCfg = Release|Any CPU {3DA49C12-3614-40F5-B5CE-8B95F872EFC1}.Release|Any CPU.Build.0 = Release|Any CPU - {3DA49C12-3614-40F5-B5CE-8B95F872EFC1}.Package|Any CPU.ActiveCfg = Package|Any CPU - {9AE188E0-F328-4A88-AF5F-CE0C1D4D0036}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9AE188E0-F328-4A88-AF5F-CE0C1D4D0036}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9AE188E0-F328-4A88-AF5F-CE0C1D4D0036}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9AE188E0-F328-4A88-AF5F-CE0C1D4D0036}.Release|Any CPU.Build.0 = Release|Any CPU - {9AE188E0-F328-4A88-AF5F-CE0C1D4D0036}.Package|Any CPU.ActiveCfg = Package|Any CPU - {66491D47-2BFB-45CF-A582-C11860219512}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {66491D47-2BFB-45CF-A582-C11860219512}.Debug|Any CPU.Build.0 = Debug|Any CPU - {66491D47-2BFB-45CF-A582-C11860219512}.Release|Any CPU.ActiveCfg = Release|Any CPU - {66491D47-2BFB-45CF-A582-C11860219512}.Release|Any CPU.Build.0 = Release|Any CPU - {66491D47-2BFB-45CF-A582-C11860219512}.Package|Any CPU.ActiveCfg = Package|Any CPU - {664ECD06-26EB-4F8F-8D88-5444A5E766E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {664ECD06-26EB-4F8F-8D88-5444A5E766E0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {664ECD06-26EB-4F8F-8D88-5444A5E766E0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {664ECD06-26EB-4F8F-8D88-5444A5E766E0}.Release|Any CPU.Build.0 = Release|Any CPU - {664ECD06-26EB-4F8F-8D88-5444A5E766E0}.Package|Any CPU.ActiveCfg = Package|Any CPU - {EAE5000B-9A97-4308-B791-0B71DE0A8219}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EAE5000B-9A97-4308-B791-0B71DE0A8219}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EAE5000B-9A97-4308-B791-0B71DE0A8219}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EAE5000B-9A97-4308-B791-0B71DE0A8219}.Release|Any CPU.Build.0 = Release|Any CPU - {EAE5000B-9A97-4308-B791-0B71DE0A8219}.Package|Any CPU.ActiveCfg = Package|Any CPU - {E854F61B-548A-4100-A766-35B972B9EE11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E854F61B-548A-4100-A766-35B972B9EE11}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E854F61B-548A-4100-A766-35B972B9EE11}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E854F61B-548A-4100-A766-35B972B9EE11}.Release|Any CPU.Build.0 = Release|Any CPU - {E854F61B-548A-4100-A766-35B972B9EE11}.Package|Any CPU.ActiveCfg = Package|Any CPU - {22C53CFB-B54A-438E-820F-42C94D557345}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {22C53CFB-B54A-438E-820F-42C94D557345}.Debug|Any CPU.Build.0 = Debug|Any CPU - {22C53CFB-B54A-438E-820F-42C94D557345}.Release|Any CPU.ActiveCfg = Release|Any CPU - {22C53CFB-B54A-438E-820F-42C94D557345}.Release|Any CPU.Build.0 = Release|Any CPU - {22C53CFB-B54A-438E-820F-42C94D557345}.Package|Any CPU.ActiveCfg = Package|Any CPU - {A4E85E94-383F-40EA-9478-0545070E52F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A4E85E94-383F-40EA-9478-0545070E52F5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A4E85E94-383F-40EA-9478-0545070E52F5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A4E85E94-383F-40EA-9478-0545070E52F5}.Release|Any CPU.Build.0 = Release|Any CPU - {A4E85E94-383F-40EA-9478-0545070E52F5}.Package|Any CPU.ActiveCfg = Package|Any CPU - {928090A9-AAC7-496C-A8E3-D242D2D8BC74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {928090A9-AAC7-496C-A8E3-D242D2D8BC74}.Debug|Any CPU.Build.0 = Debug|Any CPU - {928090A9-AAC7-496C-A8E3-D242D2D8BC74}.Release|Any CPU.ActiveCfg = Release|Any CPU - {928090A9-AAC7-496C-A8E3-D242D2D8BC74}.Release|Any CPU.Build.0 = Release|Any CPU - {928090A9-AAC7-496C-A8E3-D242D2D8BC74}.Package|Any CPU.ActiveCfg = Package|Any CPU - {D69B9924-5C2E-41BC-9354-A12DA7D03FDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D69B9924-5C2E-41BC-9354-A12DA7D03FDF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D69B9924-5C2E-41BC-9354-A12DA7D03FDF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D69B9924-5C2E-41BC-9354-A12DA7D03FDF}.Release|Any CPU.Build.0 = Release|Any CPU - {D69B9924-5C2E-41BC-9354-A12DA7D03FDF}.Package|Any CPU.ActiveCfg = Package|Any CPU - {ED307D87-E1BF-49B6-9591-5250D431C758}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ED307D87-E1BF-49B6-9591-5250D431C758}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ED307D87-E1BF-49B6-9591-5250D431C758}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ED307D87-E1BF-49B6-9591-5250D431C758}.Release|Any CPU.Build.0 = Release|Any CPU - {ED307D87-E1BF-49B6-9591-5250D431C758}.Package|Any CPU.ActiveCfg = Package|Any CPU - {0E4B622A-063B-4A39-87CF-F18AEACBDDC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0E4B622A-063B-4A39-87CF-F18AEACBDDC5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0E4B622A-063B-4A39-87CF-F18AEACBDDC5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0E4B622A-063B-4A39-87CF-F18AEACBDDC5}.Release|Any CPU.Build.0 = Release|Any CPU - {0E4B622A-063B-4A39-87CF-F18AEACBDDC5}.Package|Any CPU.ActiveCfg = Package|Any CPU - {E2BEAAAE-497B-49F4-AD27-03BE20924311}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E2BEAAAE-497B-49F4-AD27-03BE20924311}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E2BEAAAE-497B-49F4-AD27-03BE20924311}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E2BEAAAE-497B-49F4-AD27-03BE20924311}.Release|Any CPU.Build.0 = Release|Any CPU - {E2BEAAAE-497B-49F4-AD27-03BE20924311}.Package|Any CPU.ActiveCfg = Package|Any CPU - {F2490822-51F7-4B65-8B21-EE0082B76745}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F2490822-51F7-4B65-8B21-EE0082B76745}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F2490822-51F7-4B65-8B21-EE0082B76745}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F2490822-51F7-4B65-8B21-EE0082B76745}.Release|Any CPU.Build.0 = Release|Any CPU - {F2490822-51F7-4B65-8B21-EE0082B76745}.Package|Any CPU.ActiveCfg = Package|Any CPU - {07C97A77-61B6-4BB5-9436-3A7FC379B75E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {07C97A77-61B6-4BB5-9436-3A7FC379B75E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {07C97A77-61B6-4BB5-9436-3A7FC379B75E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {07C97A77-61B6-4BB5-9436-3A7FC379B75E}.Release|Any CPU.Build.0 = Release|Any CPU - {07C97A77-61B6-4BB5-9436-3A7FC379B75E}.Package|Any CPU.ActiveCfg = Package|Any CPU {7155D1E6-00CE-4081-B922-E6C5524EE600}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7155D1E6-00CE-4081-B922-E6C5524EE600}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7155D1E6-00CE-4081-B922-E6C5524EE600}.Package|Any CPU.ActiveCfg = Package|Any CPU {7155D1E6-00CE-4081-B922-E6C5524EE600}.Release|Any CPU.ActiveCfg = Release|Any CPU {7155D1E6-00CE-4081-B922-E6C5524EE600}.Release|Any CPU.Build.0 = Release|Any CPU - {7155D1E6-00CE-4081-B922-E6C5524EE600}.Package|Any CPU.ActiveCfg = Package|Any CPU {9FE6A783-C20D-4097-9988-4178E2C4CE75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9FE6A783-C20D-4097-9988-4178E2C4CE75}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9FE6A783-C20D-4097-9988-4178E2C4CE75}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9FE6A783-C20D-4097-9988-4178E2C4CE75}.Release|Any CPU.Build.0 = Release|Any CPU {9FE6A783-C20D-4097-9988-4178E2C4CE75}.Package|Any CPU.ActiveCfg = Package|Any CPU {9FE6A783-C20D-4097-9988-4178E2C4CE75}.Package|Any CPU.Build.0 = Package|Any CPU + {9FE6A783-C20D-4097-9988-4178E2C4CE75}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9FE6A783-C20D-4097-9988-4178E2C4CE75}.Release|Any CPU.Build.0 = Release|Any CPU {1012C962-7F6D-4EC5-A0EC-0741A95BAD6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1012C962-7F6D-4EC5-A0EC-0741A95BAD6B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1012C962-7F6D-4EC5-A0EC-0741A95BAD6B}.Package|Any CPU.ActiveCfg = Package|Any CPU {1012C962-7F6D-4EC5-A0EC-0741A95BAD6B}.Release|Any CPU.ActiveCfg = Release|Any CPU {1012C962-7F6D-4EC5-A0EC-0741A95BAD6B}.Release|Any CPU.Build.0 = Release|Any CPU - {1012C962-7F6D-4EC5-A0EC-0741A95BAD6B}.Package|Any CPU.ActiveCfg = Package|Any CPU - {A7CACAE7-66E7-43DA-948B-28EB0DDDB582}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A7CACAE7-66E7-43DA-948B-28EB0DDDB582}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A7CACAE7-66E7-43DA-948B-28EB0DDDB582}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A7CACAE7-66E7-43DA-948B-28EB0DDDB582}.Release|Any CPU.Build.0 = Release|Any CPU - {A7CACAE7-66E7-43DA-948B-28EB0DDDB582}.Package|Any CPU.ActiveCfg = Package|Any CPU {5F68A5B1-7907-4B16-8AFE-326E9DD7D65B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5F68A5B1-7907-4B16-8AFE-326E9DD7D65B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5F68A5B1-7907-4B16-8AFE-326E9DD7D65B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5F68A5B1-7907-4B16-8AFE-326E9DD7D65B}.Release|Any CPU.Build.0 = Release|Any CPU {5F68A5B1-7907-4B16-8AFE-326E9DD7D65B}.Package|Any CPU.ActiveCfg = Package|Any CPU {5F68A5B1-7907-4B16-8AFE-326E9DD7D65B}.Package|Any CPU.Build.0 = Package|Any CPU + {5F68A5B1-7907-4B16-8AFE-326E9DD7D65B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5F68A5B1-7907-4B16-8AFE-326E9DD7D65B}.Release|Any CPU.Build.0 = Release|Any CPU {16C89E7C-1575-4685-8DFA-8E7E2C6101BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {16C89E7C-1575-4685-8DFA-8E7E2C6101BF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {16C89E7C-1575-4685-8DFA-8E7E2C6101BF}.Package|Any CPU.ActiveCfg = Package|Any CPU {16C89E7C-1575-4685-8DFA-8E7E2C6101BF}.Release|Any CPU.ActiveCfg = Release|Any CPU {16C89E7C-1575-4685-8DFA-8E7E2C6101BF}.Release|Any CPU.Build.0 = Release|Any CPU - {16C89E7C-1575-4685-8DFA-8E7E2C6101BF}.Package|Any CPU.ActiveCfg = Package|Any CPU - {EA387B4B-DAD0-4E34-B8A3-79EA4616726A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EA387B4B-DAD0-4E34-B8A3-79EA4616726A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EA387B4B-DAD0-4E34-B8A3-79EA4616726A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EA387B4B-DAD0-4E34-B8A3-79EA4616726A}.Release|Any CPU.Build.0 = Release|Any CPU - {EA387B4B-DAD0-4E34-B8A3-79EA4616726A}.Package|Any CPU.ActiveCfg = Package|Any CPU - {3326DB6E-023E-483F-9A1C-5905D3091B57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3326DB6E-023E-483F-9A1C-5905D3091B57}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3326DB6E-023E-483F-9A1C-5905D3091B57}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3326DB6E-023E-483F-9A1C-5905D3091B57}.Release|Any CPU.Build.0 = Release|Any CPU - {3326DB6E-023E-483F-9A1C-5905D3091B57}.Package|Any CPU.ActiveCfg = Package|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -366,31 +245,14 @@ Global {5D5A3137-F118-4F6C-ABE7-2523184A3A2D} = {541093F6-616E-43D9-B671-FCD1F9C0A181} {BDA099C5-E435-49DF-9922-58D63E11B764} = {541093F6-616E-43D9-B671-FCD1F9C0A181} {3DA49C12-3614-40F5-B5CE-8B95F872EFC1} = {541093F6-616E-43D9-B671-FCD1F9C0A181} - {9AE188E0-F328-4A88-AF5F-CE0C1D4D0036} = {F716F1EF-81EF-4020-914A-5422A13A9E13} - {66491D47-2BFB-45CF-A582-C11860219512} = {F716F1EF-81EF-4020-914A-5422A13A9E13} - {664ECD06-26EB-4F8F-8D88-5444A5E766E0} = {F716F1EF-81EF-4020-914A-5422A13A9E13} - {EAE5000B-9A97-4308-B791-0B71DE0A8219} = {F716F1EF-81EF-4020-914A-5422A13A9E13} - {E854F61B-548A-4100-A766-35B972B9EE11} = {F716F1EF-81EF-4020-914A-5422A13A9E13} - {22C53CFB-B54A-438E-820F-42C94D557345} = {F716F1EF-81EF-4020-914A-5422A13A9E13} - {A4E85E94-383F-40EA-9478-0545070E52F5} = {F716F1EF-81EF-4020-914A-5422A13A9E13} - {928090A9-AAC7-496C-A8E3-D242D2D8BC74} = {F716F1EF-81EF-4020-914A-5422A13A9E13} - {D69B9924-5C2E-41BC-9354-A12DA7D03FDF} = {F716F1EF-81EF-4020-914A-5422A13A9E13} - {ED307D87-E1BF-49B6-9591-5250D431C758} = {F716F1EF-81EF-4020-914A-5422A13A9E13} - {0E4B622A-063B-4A39-87CF-F18AEACBDDC5} = {F716F1EF-81EF-4020-914A-5422A13A9E13} - {E2BEAAAE-497B-49F4-AD27-03BE20924311} = {F716F1EF-81EF-4020-914A-5422A13A9E13} - {F2490822-51F7-4B65-8B21-EE0082B76745} = {F716F1EF-81EF-4020-914A-5422A13A9E13} - {07C97A77-61B6-4BB5-9436-3A7FC379B75E} = {F716F1EF-81EF-4020-914A-5422A13A9E13} {7155D1E6-00CE-4081-B922-E6C5524EE600} = {541093F6-616E-43D9-B671-FCD1F9C0A181} {9FE6A783-C20D-4097-9988-4178E2C4CE75} = {126EA539-4B28-4B07-8B5D-D1D7F794D189} {1012C962-7F6D-4EC5-A0EC-0741A95BAD6B} = {541093F6-616E-43D9-B671-FCD1F9C0A181} - {A7CACAE7-66E7-43DA-948B-28EB0DDDB582} = {F716F1EF-81EF-4020-914A-5422A13A9E13} {5F68A5B1-7907-4B16-8AFE-326E9DD7D65B} = {126EA539-4B28-4B07-8B5D-D1D7F794D189} {16C89E7C-1575-4685-8DFA-8E7E2C6101BF} = {541093F6-616E-43D9-B671-FCD1F9C0A181} - {EA387B4B-DAD0-4E34-B8A3-79EA4616726A} = {F716F1EF-81EF-4020-914A-5422A13A9E13} - {3326DB6E-023E-483F-9A1C-5905D3091B57} = {F716F1EF-81EF-4020-914A-5422A13A9E13} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - {9FE6A783-C20D-4097-9988-4178E2C4CE75} = {126EA539-4B28-4B07-8B5D-D1D7F794D189} SolutionGuid = {1FBD8DF1-D90A-4F21-8EB6-DA17B9431FE3} + {9FE6A783-C20D-4097-9988-4178E2C4CE75} = {126EA539-4B28-4B07-8B5D-D1D7F794D189} EndGlobalSection EndGlobal From b03fcba836d03d3ee7579bfb500fa959bf58b564 Mon Sep 17 00:00:00 2001 From: Ruben Buniatyan Date: Thu, 25 Aug 2022 20:49:05 +0200 Subject: [PATCH 05/15] Add GitHub Actions workflow --- .github/workflows/build.yml | 45 +++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..52c6bed7 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,45 @@ +name: Build + +on: + push: + paths: + - '.github/workflows/build.yml' + - 'src/**' + workflow_dispatch: + inputs: + publish: + description: 'Publish package' + default: false + required: false + type: boolean + +jobs: + build: + env: + BUILD_CONFIG: release + name: Build + runs-on: ubuntu-latest + steps: + + - name: Check out repository + uses: actions/checkout@v3 + + - name: Set up .NET + uses: actions/setup-dotnet@v2 + with: + dotnet-version: 6.0.x + + - name: Install dependencies + run: dotnet restore + + - name: Build + run: dotnet build -c ${{ env.BUILD_CONFIG }} --no-restore -p:ContinuousIntegrationBuild=true + + #- name: Test + # run: dotnet test -c ${{ env.BUILD_CONFIG }} --no-restore + + - name: Publish + if: ${{ inputs.publish }} + run: | + dotnet pack -c ${{ env.BUILD_CONFIG }} --no-build + dotnet nuget push build_output/packages/*.nupkg -k ${{ secrets.NUGET_API_KEY }} -s https://apiint.nugettest.org/v3/index.json From 43ff957f62fcdc69c7457e84f0093f76216c54b4 Mon Sep 17 00:00:00 2001 From: Ruben Buniatyan Date: Fri, 21 Oct 2022 17:24:00 +0400 Subject: [PATCH 06/15] Revise versioning --- src/Directory.Build.props | 2 +- src/DotNetty.Codecs.Mqtt/DotNetty.Codecs.Mqtt.csproj | 2 +- src/DotNetty.Transport.Libuv/DotNetty.Transport.Libuv.csproj | 2 +- src/shared/SharedAssemblyInfo.cs | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 9e6fd0f1..c5e968a6 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -16,7 +16,7 @@ True true - 0.7.5-preview.1 + 1.0.0 $(PackageVersion) diff --git a/src/DotNetty.Codecs.Mqtt/DotNetty.Codecs.Mqtt.csproj b/src/DotNetty.Codecs.Mqtt/DotNetty.Codecs.Mqtt.csproj index f7675cb2..58e1f7a2 100644 --- a/src/DotNetty.Codecs.Mqtt/DotNetty.Codecs.Mqtt.csproj +++ b/src/DotNetty.Codecs.Mqtt/DotNetty.Codecs.Mqtt.csproj @@ -8,7 +8,7 @@ © Microsoft Corporation. All rights reserved.--> DotNetty: MQTT codec en-US - $(NoWarn);CS1591 false diff --git a/src/DotNetty.Transport.Libuv/DotNetty.Transport.Libuv.csproj b/src/DotNetty.Transport.Libuv/DotNetty.Transport.Libuv.csproj index d858c396..cde6ed7b 100644 --- a/src/DotNetty.Transport.Libuv/DotNetty.Transport.Libuv.csproj +++ b/src/DotNetty.Transport.Libuv/DotNetty.Transport.Libuv.csproj @@ -9,7 +9,7 @@ © Microsoft Corporation. All rights reserved.--> DotNetty: libuv transport model Experimental en-US - $(NoWarn);CS1591 True diff --git a/src/shared/SharedAssemblyInfo.cs b/src/shared/SharedAssemblyInfo.cs index 753187bb..89be3dac 100644 --- a/src/shared/SharedAssemblyInfo.cs +++ b/src/shared/SharedAssemblyInfo.cs @@ -7,6 +7,6 @@ [assembly: AssemblyCompany("Nethermind, Microsoft")] [assembly: AssemblyProduct("DotNetty")] -[assembly: AssemblyVersion("0.7.5")] -[assembly: AssemblyFileVersion("0.7.5")] +[assembly: AssemblyVersion("1.0.0")] +[assembly: AssemblyFileVersion("1.0.0")] [assembly: AssemblyCopyright("Demerzel Solutions Limited, Microsoft Corporation")] From 823cee700972b01194b23cd8d7f9defad15643ab Mon Sep 17 00:00:00 2001 From: Ruben Buniatyan Date: Fri, 21 Oct 2022 19:27:26 +0400 Subject: [PATCH 07/15] Change NuGet feed --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 52c6bed7..47f5c749 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -42,4 +42,4 @@ jobs: if: ${{ inputs.publish }} run: | dotnet pack -c ${{ env.BUILD_CONFIG }} --no-build - dotnet nuget push build_output/packages/*.nupkg -k ${{ secrets.NUGET_API_KEY }} -s https://apiint.nugettest.org/v3/index.json + dotnet nuget push build_output/packages/*.nupkg -k ${{ secrets.NUGET_API_KEY }} -s https://api.nuget.org/v3/index.json From a4d84bf2787a3441a7adab66f3a266b533e08841 Mon Sep 17 00:00:00 2001 From: MarekM25 Date: Wed, 28 Jun 2023 15:19:46 +0200 Subject: [PATCH 08/15] Handling null in Transfer method --- src/DotNetty.Common/ThreadLocalPool.cs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/DotNetty.Common/ThreadLocalPool.cs b/src/DotNetty.Common/ThreadLocalPool.cs index 327cb15e..c4819bc5 100644 --- a/src/DotNetty.Common/ThreadLocalPool.cs +++ b/src/DotNetty.Common/ThreadLocalPool.cs @@ -236,7 +236,7 @@ internal void Add(DefaultHandle handle) // transfer as many items as we can from this queue to the stack, returning true if any were transferred internal bool Transfer(Stack dst) { - Link head = this.head.link; + Link head = this.head?.link; if (head == null) { return false; @@ -259,6 +259,11 @@ internal bool Transfer(Stack dst) return false; } + if (dst?.elements == null) + { + return false; + } + int dstSize = dst.size; int expectedCapacity = dstSize + srcSize; @@ -273,9 +278,19 @@ internal bool Transfer(Stack dst) DefaultHandle[] srcElems = head.elements; DefaultHandle[] dstElems = dst.elements; int newDstSize = dstSize; + if (head.elements == null) + { + return false; + } + for (int i = srcStart; i < srcEnd; i++) { DefaultHandle element = srcElems[i]; + if (element == null) + { + return false; + } + if (element.recycleId == 0) { element.recycleId = element.lastRecycledId; From a1fcc1ba60046f74bb9ce465a7b7d1a74d74ec6c Mon Sep 17 00:00:00 2001 From: MarekM25 Date: Wed, 28 Jun 2023 15:45:19 +0200 Subject: [PATCH 09/15] try-catch for null reference in Transfer --- src/DotNetty.Common/ThreadLocalPool.cs | 137 +++++++++++++------------ 1 file changed, 74 insertions(+), 63 deletions(-) diff --git a/src/DotNetty.Common/ThreadLocalPool.cs b/src/DotNetty.Common/ThreadLocalPool.cs index c4819bc5..2ea2fc89 100644 --- a/src/DotNetty.Common/ThreadLocalPool.cs +++ b/src/DotNetty.Common/ThreadLocalPool.cs @@ -236,98 +236,109 @@ internal void Add(DefaultHandle handle) // transfer as many items as we can from this queue to the stack, returning true if any were transferred internal bool Transfer(Stack dst) { - Link head = this.head?.link; - if (head == null) + try { - return false; - } - - if (head.ReadIndex == LinkCapacity) - { - if (head.next == null) + Link head = this.head?.link; + if (head == null) { return false; } - this.head.link = head = head.next; - } - int srcStart = head.ReadIndex; - int srcEnd = head.WriteIndex; - int srcSize = srcEnd - srcStart; - if (srcSize == 0) - { - return false; - } + if (head.ReadIndex == LinkCapacity) + { + if (head.next == null) + { + return false; + } - if (dst?.elements == null) - { - return false; - } - - int dstSize = dst.size; - int expectedCapacity = dstSize + srcSize; + this.head.link = head = head.next; + } - if (expectedCapacity > dst.elements.Length) - { - int actualCapacity = dst.IncreaseCapacity(expectedCapacity); - srcEnd = Math.Min(srcStart + actualCapacity - dstSize, srcEnd); - } + int srcStart = head.ReadIndex; + int srcEnd = head.WriteIndex; + int srcSize = srcEnd - srcStart; + if (srcSize == 0) + { + return false; + } - if (srcStart != srcEnd) - { - DefaultHandle[] srcElems = head.elements; - DefaultHandle[] dstElems = dst.elements; - int newDstSize = dstSize; - if (head.elements == null) + if (dst?.elements == null) { return false; } - - for (int i = srcStart; i < srcEnd; i++) + + int dstSize = dst.size; + int expectedCapacity = dstSize + srcSize; + + if (expectedCapacity > dst.elements.Length) { - DefaultHandle element = srcElems[i]; - if (element == null) + int actualCapacity = dst.IncreaseCapacity(expectedCapacity); + srcEnd = Math.Min(srcStart + actualCapacity - dstSize, srcEnd); + } + + if (srcStart != srcEnd) + { + DefaultHandle[] srcElems = head.elements; + DefaultHandle[] dstElems = dst.elements; + int newDstSize = dstSize; + if (head.elements == null) { return false; } - - if (element.recycleId == 0) + + for (int i = srcStart; i < srcEnd; i++) { - element.recycleId = element.lastRecycledId; + DefaultHandle element = srcElems[i]; + if (element == null) + { + return false; + } + + if (element.recycleId == 0) + { + element.recycleId = element.lastRecycledId; + } + else if (element.recycleId != element.lastRecycledId) + { + throw new InvalidOperationException("recycled already"); + } + + srcElems[i] = null; + + if (dst.DropHandle(element)) + { + // Drop the object. + continue; + } + + element.Stack = dst; + dstElems[newDstSize++] = element; } - else if (element.recycleId != element.lastRecycledId) + + if (srcEnd == LinkCapacity && head.next != null) { - throw new InvalidOperationException("recycled already"); + // Add capacity back as the Link is GCed. + this.head.ReclaimSpace(LinkCapacity); + this.head.link = head.next; } - srcElems[i] = null; - if (dst.DropHandle(element)) + head.ReadIndex = srcEnd; + if (dst.size == newDstSize) { - // Drop the object. - continue; + return false; } - element.Stack = dst; - dstElems[newDstSize++] = element; - } - if (srcEnd == LinkCapacity && head.next != null) - { - // Add capacity back as the Link is GCed. - this.head.ReclaimSpace(LinkCapacity); - this.head.link = head.next; + dst.size = newDstSize; + return true; } - - head.ReadIndex = srcEnd; - if (dst.size == newDstSize) + else { + // The destination stack is full already. return false; } - dst.size = newDstSize; - return true; } - else + catch (NullReferenceException) { - // The destination stack is full already. return false; } } From 0333dbd71a00ee0329b81ae19d7aac9fd93f3f7c Mon Sep 17 00:00:00 2001 From: Ruben Buniatyan Date: Thu, 29 Jun 2023 14:25:47 +0200 Subject: [PATCH 10/15] Update package version and feed --- .github/workflows/build.yml | 2 +- src/Directory.Build.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 47f5c749..57540175 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -42,4 +42,4 @@ jobs: if: ${{ inputs.publish }} run: | dotnet pack -c ${{ env.BUILD_CONFIG }} --no-build - dotnet nuget push build_output/packages/*.nupkg -k ${{ secrets.NUGET_API_KEY }} -s https://api.nuget.org/v3/index.json + dotnet nuget push build_output/packages/*.nupkg -k ${{ secrets.NUGETTEST_API_KEY }} -s https://apiint.nugettest.org/v3/index.json diff --git a/src/Directory.Build.props b/src/Directory.Build.props index c5e968a6..3c8a1fce 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -16,7 +16,7 @@ True true - 1.0.0 + 1.0.1-preview.1 $(PackageVersion) From 1c9d84e40239d6bb1345dc7dfaafbe70b8a46f4d Mon Sep 17 00:00:00 2001 From: MarekM25 Date: Tue, 4 Jul 2023 13:55:21 +0200 Subject: [PATCH 11/15] remove try catch --- src/DotNetty.Common/ThreadLocalPool.cs | 218 ++++++++++++++----------- 1 file changed, 127 insertions(+), 91 deletions(-) diff --git a/src/DotNetty.Common/ThreadLocalPool.cs b/src/DotNetty.Common/ThreadLocalPool.cs index 2ea2fc89..a643101c 100644 --- a/src/DotNetty.Common/ThreadLocalPool.cs +++ b/src/DotNetty.Common/ThreadLocalPool.cs @@ -56,6 +56,7 @@ public override void Release(T value) { throw new InvalidOperationException("recycled already"); } + stack.Push(this); } } @@ -107,6 +108,7 @@ internal Head(StrongBox availableSharedCapacity, StrongBox weakTableCo { Interlocked.Decrement(ref this.weakTableCounter.Value); } + if (this.availableSharedCapacity == null) { return; @@ -138,13 +140,14 @@ internal bool ReserveSpace(int space) internal static bool ReserveSpace(StrongBox availableSharedCapacity, int space) { Debug.Assert(space >= 0); - for (; ; ) + for (;;) { int available = Volatile.Read(ref availableSharedCapacity.Value); if (available < space) { return false; } + if (Interlocked.CompareExchange(ref availableSharedCapacity.Value, available - space, available) == available) { return true; @@ -155,7 +158,9 @@ internal static bool ReserveSpace(StrongBox availableSharedCapacity, int sp // chain of data items readonly Head head; + Link tail; + // pointer to another queue of delayed items for the same stack internal WeakOrderQueue next; internal readonly WeakReference owner; @@ -220,10 +225,12 @@ internal void Add(DefaultHandle handle) // Drop it. return; } + // We allocate a Link so reserve the space this.tail = tail = tail.next = new Link(); writeIndex = tail.WriteIndex; } + tail.elements[writeIndex] = handle; handle.Stack = null; // we lazy set to ensure that setting stack to null appears before we unnull it in the owning thread; @@ -236,109 +243,102 @@ internal void Add(DefaultHandle handle) // transfer as many items as we can from this queue to the stack, returning true if any were transferred internal bool Transfer(Stack dst) { - try + Link head = this.head?.link; + if (head == null) + { + return false; + } + + if (head.ReadIndex == LinkCapacity) { - Link head = this.head?.link; - if (head == null) + if (head.next == null) { return false; } - if (head.ReadIndex == LinkCapacity) - { - if (head.next == null) - { - return false; - } + this.head.link = head = head.next; + } - this.head.link = head = head.next; - } + int srcStart = head.ReadIndex; + int srcEnd = head.WriteIndex; + int srcSize = srcEnd - srcStart; + if (srcSize == 0) + { + return false; + } - int srcStart = head.ReadIndex; - int srcEnd = head.WriteIndex; - int srcSize = srcEnd - srcStart; - if (srcSize == 0) - { - return false; - } + if (dst?.elements == null) + { + return false; + } - if (dst?.elements == null) - { - return false; - } + int dstSize = dst.size; + int expectedCapacity = dstSize + srcSize; - int dstSize = dst.size; - int expectedCapacity = dstSize + srcSize; + if (expectedCapacity > dst.elements.Length) + { + int actualCapacity = dst.IncreaseCapacity(expectedCapacity); + srcEnd = Math.Min(srcStart + actualCapacity - dstSize, srcEnd); + } - if (expectedCapacity > dst.elements.Length) + if (srcStart != srcEnd) + { + DefaultHandle[] srcElems = head.elements; + DefaultHandle[] dstElems = dst.elements; + int newDstSize = dstSize; + if (head.elements == null) { - int actualCapacity = dst.IncreaseCapacity(expectedCapacity); - srcEnd = Math.Min(srcStart + actualCapacity - dstSize, srcEnd); + return false; } - if (srcStart != srcEnd) + for (int i = srcStart; i < srcEnd; i++) { - DefaultHandle[] srcElems = head.elements; - DefaultHandle[] dstElems = dst.elements; - int newDstSize = dstSize; - if (head.elements == null) + DefaultHandle element = srcElems[i]; + if (element == null) { return false; } - for (int i = srcStart; i < srcEnd; i++) + if (element.recycleId == 0) { - DefaultHandle element = srcElems[i]; - if (element == null) - { - return false; - } - - if (element.recycleId == 0) - { - element.recycleId = element.lastRecycledId; - } - else if (element.recycleId != element.lastRecycledId) - { - throw new InvalidOperationException("recycled already"); - } - - srcElems[i] = null; - - if (dst.DropHandle(element)) - { - // Drop the object. - continue; - } - - element.Stack = dst; - dstElems[newDstSize++] = element; + element.recycleId = element.lastRecycledId; } - - if (srcEnd == LinkCapacity && head.next != null) + else if (element.recycleId != element.lastRecycledId) { - // Add capacity back as the Link is GCed. - this.head.ReclaimSpace(LinkCapacity); - this.head.link = head.next; + throw new InvalidOperationException("recycled already"); } - head.ReadIndex = srcEnd; - if (dst.size == newDstSize) + srcElems[i] = null; + + if (dst.DropHandle(element)) { - return false; + // Drop the object. + continue; } - dst.size = newDstSize; - return true; + element.Stack = dst; + dstElems[newDstSize++] = element; } - else + + if (srcEnd == LinkCapacity && head.next != null) + { + // Add capacity back as the Link is GCed. + this.head.ReclaimSpace(LinkCapacity); + this.head.link = head.next; + } + + head.ReadIndex = srcEnd; + if (dst.size == newDstSize) { - // The destination stack is full already. return false; } + + dst.size = newDstSize; + return true; } - catch (NullReferenceException) + else { + // The destination stack is full already. return false; } } @@ -370,8 +370,13 @@ protected sealed class Stack WeakOrderQueue cursorQueue, prevQueue; volatile WeakOrderQueue headQueue; - internal Stack(ThreadLocalPool parent, Thread thread, int maxCapacity, int maxSharedCapacityFactor, - int ratioMask, int maxDelayedQueues) + internal Stack( + ThreadLocalPool parent, + Thread thread, + int maxCapacity, + int maxSharedCapacityFactor, + int ratioMask, + int maxDelayedQueues) { this.parent = parent; this.threadRef = new WeakReference(thread); @@ -436,6 +441,7 @@ void PushNow(DefaultHandle item) { throw new InvalidOperationException("released already"); } + item.recycleId = item.lastRecycledId = ownThreadId; int size = this.size; @@ -444,6 +450,7 @@ void PushNow(DefaultHandle item) // Hit the maximum capacity - drop the possibly youngest object. return; } + if (size == this.elements.Length) { Array.Resize(ref this.elements, Math.Min(size << 1, this.maxCapacity)); @@ -469,12 +476,14 @@ void PushLater(DefaultHandle item, Thread thread) delayedRecycled.Add(this, WeakOrderQueue.Dummy); return; } + // Check if we already reached the maximum number of delayed queues and if we can allocate at all. if ((queue = WeakOrderQueue.Allocate(this, thread, countedWeakTable)) == null) { // drop object return; } + delayedRecycled.Add(this, queue); } else if (queue == WeakOrderQueue.Dummy) @@ -495,8 +504,10 @@ internal bool DropHandle(DefaultHandle handle) // Drop the object. return true; } + handle.hasBeenRecycled = true; } + return false; } @@ -512,8 +523,10 @@ internal bool TryPop(out DefaultHandle item) item = null; return false; } + size = this.size; } + size--; DefaultHandle ret = this.elements[size]; elements[size] = null; @@ -521,6 +534,7 @@ internal bool TryPop(out DefaultHandle item) { throw new InvalidOperationException("recycled multiple times"); } + ret.recycleId = 0; ret.lastRecycledId = 0; this.size = size; @@ -590,6 +604,7 @@ bool ScavengeSome() } } } + if (prev != null) { prev.Next = next; @@ -630,6 +645,7 @@ public class CountedWeakTable internal readonly StrongBox Counter = new StrongBox(); } + protected override CountedWeakTable GetInitialValue() => new CountedWeakTable(); } @@ -638,8 +654,9 @@ static ThreadLocalPool() // In the future, we might have different maxCapacity for different object types. // e.g. io.netty.recycler.maxCapacity.writeTask // io.netty.recycler.maxCapacity.outboundBuffer - int maxCapacityPerThread = SystemPropertyUtil.GetInt("io.netty.recycler.maxCapacityPerThread", - SystemPropertyUtil.GetInt("io.netty.recycler.maxCapacity", DefaultInitialMaxCapacityPerThread)); + int maxCapacityPerThread = SystemPropertyUtil.GetInt( + "io.netty.recycler.maxCapacityPerThread", + SystemPropertyUtil.GetInt("io.netty.recycler.maxCapacity", DefaultInitialMaxCapacityPerThread)); if (maxCapacityPerThread < 0) { maxCapacityPerThread = DefaultInitialMaxCapacityPerThread; @@ -647,17 +664,21 @@ static ThreadLocalPool() DefaultMaxCapacityPerThread = maxCapacityPerThread; - DefaultMaxSharedCapacityFactor = Math.Max(2, - SystemPropertyUtil.GetInt("io.netty.recycler.maxSharedCapacityFactor", - 2)); + DefaultMaxSharedCapacityFactor = Math.Max( + 2, + SystemPropertyUtil.GetInt( + "io.netty.recycler.maxSharedCapacityFactor", + 2)); - DefaultMaxDelayedQueuesPerThread = Math.Max(0, - SystemPropertyUtil.GetInt("io.netty.recycler.maxDelayedQueuesPerThread", - // We use the same value as default EventLoop number - Environment.ProcessorCount * 2)); + DefaultMaxDelayedQueuesPerThread = Math.Max( + 0, + SystemPropertyUtil.GetInt( + "io.netty.recycler.maxDelayedQueuesPerThread", + // We use the same value as default EventLoop number + Environment.ProcessorCount * 2)); LinkCapacity = MathUtil.SafeFindNextPositivePowerOfTwo( - Math.Max(SystemPropertyUtil.GetInt("io.netty.recycler.linkCapacity", 16), 16)); + Math.Max(SystemPropertyUtil.GetInt("io.netty.recycler.linkCapacity", 16), 16)); // By default we allow one push to a Recycler for each 8th try on handles that were never recycled before. // This should help to slowly increase the capacity of the recycler while not be too sensitive to allocation @@ -689,12 +710,15 @@ static ThreadLocalPool() } public ThreadLocalPool(int maxCapacityPerThread) - : this (maxCapacityPerThread, DefaultMaxSharedCapacityFactor, DefaultRatio, DefaultMaxDelayedQueuesPerThread) + : this(maxCapacityPerThread, DefaultMaxSharedCapacityFactor, DefaultRatio, DefaultMaxDelayedQueuesPerThread) { } - public ThreadLocalPool(int maxCapacityPerThread, int maxSharedCapacityFactor, - int ratio, int maxDelayedQueuesPerThread) + public ThreadLocalPool( + int maxCapacityPerThread, + int maxSharedCapacityFactor, + int ratio, + int maxDelayedQueuesPerThread) { this.ratioMask = MathUtil.SafeFindNextPositivePowerOfTwo(ratio) - 1; if (maxCapacityPerThread <= 0) @@ -744,8 +768,13 @@ public ThreadLocalPool(Func valueFactory, int maxCapacityPerThread, i { } - public ThreadLocalPool(Func valueFactory, int maxCapacityPerThread, int maxSharedCapacityFactor, - int ratio, int maxDelayedQueuesPerThread, bool preCreate = false) + public ThreadLocalPool( + Func valueFactory, + int maxCapacityPerThread, + int maxSharedCapacityFactor, + int ratio, + int maxDelayedQueuesPerThread, + bool preCreate = false) : base(maxCapacityPerThread, maxSharedCapacityFactor, ratio, maxDelayedQueuesPerThread) { Contract.Requires(valueFactory != null); @@ -769,6 +798,7 @@ public T Take() { handle = CreateValue(stack); } + return (T)handle.Value; } @@ -794,8 +824,13 @@ public ThreadLocalStack(ThreadLocalPool owner) protected override Stack GetInitialValue() { - var stack = new Stack(this.owner, Thread.CurrentThread, this.owner.maxCapacityPerThread, - this.owner.maxSharedCapacityFactor, this.owner.ratioMask, this.owner.maxDelayedQueuesPerThread); + var stack = new Stack( + this.owner, + Thread.CurrentThread, + this.owner.maxCapacityPerThread, + this.owner.maxSharedCapacityFactor, + this.owner.ratioMask, + this.owner.maxDelayedQueuesPerThread); if (this.owner.preCreate) { for (int i = 0; i < this.owner.maxCapacityPerThread; i++) @@ -803,6 +838,7 @@ protected override Stack GetInitialValue() stack.Push(this.owner.CreateValue(stack)); } } + return stack; } From 57440534dfbcc47c86b759c92dcdaffd7cf24053 Mon Sep 17 00:00:00 2001 From: Ruben Buniatyan Date: Tue, 4 Jul 2023 14:01:18 +0200 Subject: [PATCH 12/15] Bump up the version --- src/Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 3c8a1fce..c27273d1 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -16,7 +16,7 @@ True true - 1.0.1-preview.1 + 1.0.1-preview.2 $(PackageVersion) From 2d5a39a895fd401a9b862b069ae194b49cd4ccf6 Mon Sep 17 00:00:00 2001 From: Ruben Buniatyan Date: Mon, 31 Jul 2023 16:21:56 +0200 Subject: [PATCH 13/15] Remove pre-release designator --- src/Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index c27273d1..a250448a 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -16,7 +16,7 @@ True true - 1.0.1-preview.2 + 1.0.1 $(PackageVersion) From 8054b28c0e56eef21efa102d5ad2797cad5fda6d Mon Sep 17 00:00:00 2001 From: Ruben Buniatyan Date: Mon, 31 Jul 2023 16:23:34 +0200 Subject: [PATCH 14/15] Revert publishing feed --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 57540175..47f5c749 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -42,4 +42,4 @@ jobs: if: ${{ inputs.publish }} run: | dotnet pack -c ${{ env.BUILD_CONFIG }} --no-build - dotnet nuget push build_output/packages/*.nupkg -k ${{ secrets.NUGETTEST_API_KEY }} -s https://apiint.nugettest.org/v3/index.json + dotnet nuget push build_output/packages/*.nupkg -k ${{ secrets.NUGET_API_KEY }} -s https://api.nuget.org/v3/index.json From 0941a7d3e2ba9ff4df5436bc9211a99dc67d5bcd Mon Sep 17 00:00:00 2001 From: Ruben Buniatyan Date: Sun, 20 Jul 2025 17:28:35 +0200 Subject: [PATCH 15/15] Bump up version --- src/Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index a250448a..b8534948 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -16,7 +16,7 @@ True true - 1.0.1 + 1.0.2.076 $(PackageVersion)