From 72ba0bb1393f07e7d8bda4c6f4f774c37ae65814 Mon Sep 17 00:00:00 2001 From: Christoph Bauer Date: Thu, 12 Jun 2025 10:11:00 +0200 Subject: [PATCH 01/14] .NET8 as Framework target added This is needed for addition Pull Request using Linux Features (TCP KeepAlive) --- .travis.yml | 2 +- src/NetMQ/Annotations.cs | 2 +- src/NetMQ/AsyncReceiveExtensions.cs | 4 +--- src/NetMQ/Core/Mechanisms/CurveClientMechanism.cs | 2 +- src/NetMQ/Core/Mechanisms/CurveServerMechanism.cs | 4 ++-- src/NetMQ/Core/Transports/Pgm/PgmSocket.cs | 2 +- src/NetMQ/Core/Transports/Tcp/TcpListener.cs | 4 ++-- src/NetMQ/Core/Utils/OpCode.cs | 2 +- src/NetMQ/Core/Utils/SpanUtility.cs | 2 +- src/NetMQ/GroupSocketExtensions.cs | 4 ++-- src/NetMQ/NetMQ.csproj | 12 ++++-------- src/NetMQ/NetMQRuntime.cs | 3 --- src/NetMQ/NetMQSocket.cs | 12 +----------- src/NetMQ/ReceiveThreadSafeSocketExtensions.cs | 4 ++-- src/NetMQ/RoutingIdSocketExtensions.cs | 4 ++-- src/NetMQ/ThreadSafeSocket.cs | 4 ++-- src/NetMQ/Utils/EncodingExtensions.cs | 2 +- .../NetMQ.SimpleTests/NetMQ.SimpleTests.csproj | 2 +- src/Performance/local_lat/local_lat.csproj | 2 +- src/Performance/local_thr/local_thr.csproj | 2 +- src/Performance/remote_lat/remote_lat.csproj | 2 +- src/Performance/remote_thr/remote_thr.csproj | 2 +- 22 files changed, 30 insertions(+), 49 deletions(-) diff --git a/.travis.yml b/.travis.yml index bc93f20f6..3a11d67ff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,6 +10,6 @@ addons: script: - dotnet restore src/NetMQ.sln - - dotnet build -v q -f netstandard2.0 src/NetMQ/NetMQ.csproj + - dotnet build -v q -f netstandard2.1 src/NetMQ/NetMQ.csproj - dotnet test -v n --logger "Console;noprogress=true" -p:ParallelizeTestCollections=false -f netcoreapp2.1 --filter Category!=Beacon src/NetMQ.Tests/NetMQ.Tests.csproj -- RunConfiguration.ReporterSwitch=verbose diff --git a/src/NetMQ/Annotations.cs b/src/NetMQ/Annotations.cs index 90e761655..845df150b 100644 --- a/src/NetMQ/Annotations.cs +++ b/src/NetMQ/Annotations.cs @@ -1,6 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. See the LICENSE.md file in the project root for more information. -#if !NETSTANDARD2_1 +#if NETFRAMEWORK namespace System.Diagnostics.CodeAnalysis { diff --git a/src/NetMQ/AsyncReceiveExtensions.cs b/src/NetMQ/AsyncReceiveExtensions.cs index 10c122021..8a30d197d 100644 --- a/src/NetMQ/AsyncReceiveExtensions.cs +++ b/src/NetMQ/AsyncReceiveExtensions.cs @@ -1,5 +1,4 @@ -#if NETSTANDARD2_0 || NETSTANDARD2_1 || NET47 - + using System; using System.Collections.Generic; using System.Text; @@ -308,4 +307,3 @@ public static async Task SkipMultipartMessageAsync(this NetMQSocket socket) } } -#endif diff --git a/src/NetMQ/Core/Mechanisms/CurveClientMechanism.cs b/src/NetMQ/Core/Mechanisms/CurveClientMechanism.cs index 5715952b7..acdbf0f4a 100644 --- a/src/NetMQ/Core/Mechanisms/CurveClientMechanism.cs +++ b/src/NetMQ/Core/Mechanisms/CurveClientMechanism.cs @@ -189,7 +189,7 @@ PullMsgResult ProduceInitiate(ref Msg msg) VouchNoncePrefix.CopyTo(vouchNonce); using var rng = RandomNumberGenerator.Create(); -#if NETSTANDARD2_1 +#if NETSTANDARD || NET rng.GetBytes(vouchNonce.Slice(8)); #else byte[] temp = new byte[16]; diff --git a/src/NetMQ/Core/Mechanisms/CurveServerMechanism.cs b/src/NetMQ/Core/Mechanisms/CurveServerMechanism.cs index 1a104867b..ba5069a98 100644 --- a/src/NetMQ/Core/Mechanisms/CurveServerMechanism.cs +++ b/src/NetMQ/Core/Mechanisms/CurveServerMechanism.cs @@ -157,7 +157,7 @@ PullMsgResult ProduceWelcome(ref Msg msg) // 8-byte prefix plus 16-byte random nonce CookieNoncePrefix.CopyTo(cookieNonce); using var rng = RandomNumberGenerator.Create(); -#if NETSTANDARD2_1 +#if NETSTANDARD || NET rng.GetBytes(cookieNonce.Slice(8)); #else byte[] temp = new byte[16]; @@ -184,7 +184,7 @@ PullMsgResult ProduceWelcome(ref Msg msg) // Create full nonce for encryption // 8-byte prefix plus 16-byte random nonce WelcomeNoncePrefix.CopyTo(welcomeNonce); -#if NETSTANDARD2_1 +#if NETSTANDARD || NET rng.GetBytes(welcomeNonce.Slice(8)); #else rng.GetBytes(temp); diff --git a/src/NetMQ/Core/Transports/Pgm/PgmSocket.cs b/src/NetMQ/Core/Transports/Pgm/PgmSocket.cs index e0a2713da..6c3fcf21d 100644 --- a/src/NetMQ/Core/Transports/Pgm/PgmSocket.cs +++ b/src/NetMQ/Core/Transports/Pgm/PgmSocket.cs @@ -97,7 +97,7 @@ internal void Init() Debug.WriteLine(xMsg); // If running on Microsoft Windows, suggest to the developer that he may need to install MSMQ in order to get PGM socket support. -#if NETSTANDARD1_1_OR_GREATER +#if NETSTANDARD || NET bool isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); #else bool isWindows = true; diff --git a/src/NetMQ/Core/Transports/Tcp/TcpListener.cs b/src/NetMQ/Core/Transports/Tcp/TcpListener.cs index 0ace481fc..96ececc41 100644 --- a/src/NetMQ/Core/Transports/Tcp/TcpListener.cs +++ b/src/NetMQ/Core/Transports/Tcp/TcpListener.cs @@ -22,7 +22,7 @@ You should have received a copy of the GNU Lesser General Public License using System; using System.Diagnostics; using System.Net.Sockets; -#if NETSTANDARD2_0 || NETSTANDARD2_1 +#if NETSTANDARD || NET using System.Runtime.InteropServices; #endif using AsyncIO; @@ -142,7 +142,7 @@ public virtual void SetAddress(string addr) } } -#if NETSTANDARD2_0 || NETSTANDARD2_1 +#if NETSTANDARD || NET // This command is failing on linux if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) m_handle.ExclusiveAddressUse = false; diff --git a/src/NetMQ/Core/Utils/OpCode.cs b/src/NetMQ/Core/Utils/OpCode.cs index 060064c60..7b2fcf6e9 100644 --- a/src/NetMQ/Core/Utils/OpCode.cs +++ b/src/NetMQ/Core/Utils/OpCode.cs @@ -20,7 +20,7 @@ public static bool Open() string val = Environment.GetEnvironmentVariable("NETQM_SUPPRESS_RDTSC"); if (!string.IsNullOrEmpty(val)) return false; -#if NETSTANDARD1_1_OR_GREATER || NET471_OR_GREATER +#if NETSTANDARD || NET || NET471_OR_GREATER if (RuntimeInformation.ProcessArchitecture != Architecture.X86 && RuntimeInformation.ProcessArchitecture != Architecture.X64) { diff --git a/src/NetMQ/Core/Utils/SpanUtility.cs b/src/NetMQ/Core/Utils/SpanUtility.cs index a5c529d30..2fc6d37b7 100644 --- a/src/NetMQ/Core/Utils/SpanUtility.cs +++ b/src/NetMQ/Core/Utils/SpanUtility.cs @@ -7,7 +7,7 @@ internal static class SpanUtility { public static string ToAscii(Span bytes) { -#if NETSTANDARD2_1 +#if NETSTANDARD || NET return Encoding.ASCII.GetString(bytes); #else return Encoding.ASCII.GetString(bytes.ToArray()); diff --git a/src/NetMQ/GroupSocketExtensions.cs b/src/NetMQ/GroupSocketExtensions.cs index f4c305502..5a7cf0257 100644 --- a/src/NetMQ/GroupSocketExtensions.cs +++ b/src/NetMQ/GroupSocketExtensions.cs @@ -376,7 +376,7 @@ public static bool TryReceiveBytes(this IGroupInSocket socket, TimeSpan timeout, #region AsyncEnumerable -#if NETSTANDARD2_1 +#if NETSTANDARD || NET /// /// Provides a consuming IAsyncEnumerable for receiving messages from the socket. /// @@ -575,7 +575,7 @@ public static bool TryReceiveString(this IGroupInSocket socket, TimeSpan timeout #region AsyncEnumerable -#if NETSTANDARD2_1 +#if NETSTANDARD || NET /// /// Provides a consuming IAsyncEnumerable for receiving messages from the socket. /// diff --git a/src/NetMQ/NetMQ.csproj b/src/NetMQ/NetMQ.csproj index 788c2879c..31f33b57b 100644 --- a/src/NetMQ/NetMQ.csproj +++ b/src/NetMQ/NetMQ.csproj @@ -3,7 +3,7 @@ A 100% native C# port of the lightweight high performance messaging library ZeroMQ 4.0.0.0 - net47;netstandard2.1 + net8;net47;netstandard2.1 portable ./NetMQ.snk true @@ -24,9 +24,9 @@ true - + true - + @@ -38,11 +38,7 @@ - - - - - + diff --git a/src/NetMQ/NetMQRuntime.cs b/src/NetMQ/NetMQRuntime.cs index 87748a31c..7d03195bc 100644 --- a/src/NetMQ/NetMQRuntime.cs +++ b/src/NetMQ/NetMQRuntime.cs @@ -1,5 +1,3 @@ -#if NETSTANDARD2_0 || NETSTANDARD2_1 || NET47 - using System; using System.Threading; using System.Threading.Tasks; @@ -99,4 +97,3 @@ public void Dispose() } } -#endif \ No newline at end of file diff --git a/src/NetMQ/NetMQSocket.cs b/src/NetMQ/NetMQSocket.cs index 05a52ccbd..06f5aeab9 100644 --- a/src/NetMQ/NetMQSocket.cs +++ b/src/NetMQ/NetMQSocket.cs @@ -3,9 +3,7 @@ using System.Linq; using System.Threading; using NetMQ.Core; -#if NET40 -using NetMQ.Core.Utils; -#endif + namespace NetMQ { @@ -25,9 +23,7 @@ public abstract class NetMQSocket : INetMQSocket private EventHandler? m_sendReady; private int m_isClosed; - #if NETSTANDARD2_0 || NETSTANDARD2_1 || NET47 private NetMQRuntime? m_runtime; - #endif internal enum DefaultAction { @@ -249,13 +245,11 @@ public void Unbind(string address) /// Closes this socket, rendering it unusable. Equivalent to calling . public void Close() { - #if NETSTANDARD2_0 || NETSTANDARD2_1 || NET47 if (m_runtime != null) { m_runtime.Remove(this); m_runtime = null; } - #endif if (Interlocked.CompareExchange(ref m_isClosed, 1, 0) != 0) return; @@ -391,8 +385,6 @@ public virtual bool TrySend(ref Msg msg, TimeSpan timeout, bool more) #endregion - #if NETSTANDARD2_0 || NETSTANDARD2_1 || NET47 - internal void AttachToRuntime() { if (m_runtime == null) @@ -409,8 +401,6 @@ internal void DetachFromRuntime() m_runtime = null; } - #endif - /// /// Listen to the given endpoint for SocketEvent events. /// diff --git a/src/NetMQ/ReceiveThreadSafeSocketExtensions.cs b/src/NetMQ/ReceiveThreadSafeSocketExtensions.cs index d0a163e86..f4afa632e 100644 --- a/src/NetMQ/ReceiveThreadSafeSocketExtensions.cs +++ b/src/NetMQ/ReceiveThreadSafeSocketExtensions.cs @@ -119,7 +119,7 @@ public static ValueTask ReceiveBytesAsync(this IThreadSafeInSocket socke #region AsyncEnumerable -#if NETSTANDARD2_1 +#if NETSTANDARD || NET /// /// Provides a consuming IAsyncEnumerable for receiving messages from the socket. @@ -302,7 +302,7 @@ public static ValueTask ReceiveStringAsync(this IThreadSafeInSocket sock #region AsyncEnumerable -#if NETSTANDARD2_1 +#if NETSTANDARD || NET /// /// Provides a consuming IAsyncEnumerable for receiving messages from the socket. diff --git a/src/NetMQ/RoutingIdSocketExtensions.cs b/src/NetMQ/RoutingIdSocketExtensions.cs index 6aaac857a..53833646c 100644 --- a/src/NetMQ/RoutingIdSocketExtensions.cs +++ b/src/NetMQ/RoutingIdSocketExtensions.cs @@ -372,7 +372,7 @@ public static bool TryReceiveBytes(this IRoutingIdSocket socket, TimeSpan timeou #region AsyncEnumerable -#if NETSTANDARD2_1 +#if NET /// /// Provides a consuming IAsyncEnumerable for receiving messages from the socket. @@ -564,7 +564,7 @@ public static bool TryReceiveString(this IRoutingIdSocket socket, TimeSpan timeo #region AsyncEnumerable -#if NETSTANDARD2_1 +#if NETSTANDARD || NET /// /// Provides a consuming IAsyncEnumerable for receiving messages from the socket. diff --git a/src/NetMQ/ThreadSafeSocket.cs b/src/NetMQ/ThreadSafeSocket.cs index b0d5b7f19..d9bf7a437 100644 --- a/src/NetMQ/ThreadSafeSocket.cs +++ b/src/NetMQ/ThreadSafeSocket.cs @@ -200,13 +200,13 @@ public void Unbind(string address) /// Closes this socket, rendering it unusable. Equivalent to calling . public void Close() { - // #if NETSTANDARD2_0 || NETSTANDARD2_1 || NET47 + // if (m_runtime != null) // { // m_runtime.Remove(this); // m_runtime = null; // } - // #endif + if (Interlocked.Exchange(ref m_isClosed, 1) != 0) return; diff --git a/src/NetMQ/Utils/EncodingExtensions.cs b/src/NetMQ/Utils/EncodingExtensions.cs index 059ed556b..d46740f75 100644 --- a/src/NetMQ/Utils/EncodingExtensions.cs +++ b/src/NetMQ/Utils/EncodingExtensions.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD2_1 +#if NETFRAMEWORK using System; using System.Text; diff --git a/src/Performance/NetMQ.SimpleTests/NetMQ.SimpleTests.csproj b/src/Performance/NetMQ.SimpleTests/NetMQ.SimpleTests.csproj index d3810f061..b9fa3ad2c 100644 --- a/src/Performance/NetMQ.SimpleTests/NetMQ.SimpleTests.csproj +++ b/src/Performance/NetMQ.SimpleTests/NetMQ.SimpleTests.csproj @@ -1,7 +1,7 @@  - net6.0 + net9.0 Exe diff --git a/src/Performance/local_lat/local_lat.csproj b/src/Performance/local_lat/local_lat.csproj index d3810f061..b9fa3ad2c 100644 --- a/src/Performance/local_lat/local_lat.csproj +++ b/src/Performance/local_lat/local_lat.csproj @@ -1,7 +1,7 @@  - net6.0 + net9.0 Exe diff --git a/src/Performance/local_thr/local_thr.csproj b/src/Performance/local_thr/local_thr.csproj index d3810f061..b9fa3ad2c 100644 --- a/src/Performance/local_thr/local_thr.csproj +++ b/src/Performance/local_thr/local_thr.csproj @@ -1,7 +1,7 @@  - net6.0 + net9.0 Exe diff --git a/src/Performance/remote_lat/remote_lat.csproj b/src/Performance/remote_lat/remote_lat.csproj index 9c8142a46..6f987b465 100644 --- a/src/Performance/remote_lat/remote_lat.csproj +++ b/src/Performance/remote_lat/remote_lat.csproj @@ -1,7 +1,7 @@  - net6.0 + net9.0 Exe diff --git a/src/Performance/remote_thr/remote_thr.csproj b/src/Performance/remote_thr/remote_thr.csproj index d3810f061..b9fa3ad2c 100644 --- a/src/Performance/remote_thr/remote_thr.csproj +++ b/src/Performance/remote_thr/remote_thr.csproj @@ -1,7 +1,7 @@  - net6.0 + net9.0 Exe From 326464c9f359357143452c549f1f7658388ed8f6 Mon Sep 17 00:00:00 2001 From: Christoph Bauer Date: Thu, 12 Jun 2025 13:44:02 +0200 Subject: [PATCH 02/14] .travis ci is not used anymore --- .travis.yml | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 3a11d67ff..000000000 --- a/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: csharp -mono: none -dotnet: 3.1 - -addons: - apt: - packages: - - dotnet-sdk-2.2 - - -script: - - dotnet restore src/NetMQ.sln - - dotnet build -v q -f netstandard2.1 src/NetMQ/NetMQ.csproj - - dotnet test -v n --logger "Console;noprogress=true" -p:ParallelizeTestCollections=false -f netcoreapp2.1 --filter Category!=Beacon src/NetMQ.Tests/NetMQ.Tests.csproj -- RunConfiguration.ReporterSwitch=verbose - From ea195bf24e1218a7ecd55b8a6320769d7b83ad7d Mon Sep 17 00:00:00 2001 From: Christoph Bauer Date: Thu, 12 Jun 2025 13:54:12 +0200 Subject: [PATCH 03/14] Nuget Updates (to resolve some warnings) --- src/NetMQ.Tests/NetMQ.Tests.csproj | 11 +++++++---- src/NetMQ/Core/Utils/OpCode.cs | 2 +- src/NetMQ/NetMQ.csproj | 6 +++--- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/NetMQ.Tests/NetMQ.Tests.csproj b/src/NetMQ.Tests/NetMQ.Tests.csproj index 7f412ea62..0e1e5bcce 100644 --- a/src/NetMQ.Tests/NetMQ.Tests.csproj +++ b/src/NetMQ.Tests/NetMQ.Tests.csproj @@ -39,11 +39,14 @@ - + - - - + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/src/NetMQ/Core/Utils/OpCode.cs b/src/NetMQ/Core/Utils/OpCode.cs index 7b2fcf6e9..1cf2f3b92 100644 --- a/src/NetMQ/Core/Utils/OpCode.cs +++ b/src/NetMQ/Core/Utils/OpCode.cs @@ -20,7 +20,7 @@ public static bool Open() string val = Environment.GetEnvironmentVariable("NETQM_SUPPRESS_RDTSC"); if (!string.IsNullOrEmpty(val)) return false; -#if NETSTANDARD || NET || NET471_OR_GREATER +#if NETSTANDARD || NET if (RuntimeInformation.ProcessArchitecture != Architecture.X86 && RuntimeInformation.ProcessArchitecture != Architecture.X64) { diff --git a/src/NetMQ/NetMQ.csproj b/src/NetMQ/NetMQ.csproj index 31f33b57b..7ea18d7b1 100644 --- a/src/NetMQ/NetMQ.csproj +++ b/src/NetMQ/NetMQ.csproj @@ -3,7 +3,7 @@ A 100% native C# port of the lightweight high performance messaging library ZeroMQ 4.0.0.0 - net8;net47;netstandard2.1 + net8.0;net47;netstandard2.1 portable ./NetMQ.snk true @@ -39,12 +39,12 @@ - + - + From 598bb0167b6b2d2822f2701cf807eef8310294fd Mon Sep 17 00:00:00 2001 From: Christoph Bauer Date: Thu, 12 Jun 2025 14:32:47 +0200 Subject: [PATCH 04/14] Warnings fixed --- src/NetMQ.Tests/MessageTests.cs | 2 +- src/NetMQ.Tests/NetMQMonitorTests.cs | 21 ++-- src/NetMQ.Tests/NetMQPollerTest.cs | 25 ++--- src/NetMQ.Tests/XPubSubTests.cs | 6 +- src/NetMQ/Core/Transports/Tcp/TcpConnector.cs | 18 ++- src/NetMQ/Core/Transports/Tcp/TcpListener.cs | 105 ++++++++++-------- src/NetMQ/Core/Utils/OpCode.cs | 30 ++--- src/NetMQ/NetMQSynchronizationContext.cs | 7 +- 8 files changed, 118 insertions(+), 96 deletions(-) diff --git a/src/NetMQ.Tests/MessageTests.cs b/src/NetMQ.Tests/MessageTests.cs index 2009f8f93..3ea05d479 100644 --- a/src/NetMQ.Tests/MessageTests.cs +++ b/src/NetMQ.Tests/MessageTests.cs @@ -128,7 +128,7 @@ public void Issue52_ReqToRouterBug() var msg = router.ReceiveMultipartMessage(); Assert.Equal(3, msg.FrameCount); - Assert.Equal(msg[2].ConvertToString(), testmessage); + Assert.Equal(testmessage, msg[2].ConvertToString()); } } diff --git a/src/NetMQ.Tests/NetMQMonitorTests.cs b/src/NetMQ.Tests/NetMQMonitorTests.cs index e6665e0b4..81eb0d1d3 100644 --- a/src/NetMQ.Tests/NetMQMonitorTests.cs +++ b/src/NetMQ.Tests/NetMQMonitorTests.cs @@ -57,9 +57,9 @@ public void Monitoring() } } -#if !NET35 + [Fact] - public void StartAsync() + public async Task StartAsync() { using (var rep = new ResponseSocket()) using (var monitor = new NetMQMonitor(rep, "inproc://foo", SocketEvents.Closed)) @@ -68,10 +68,11 @@ public void StartAsync() Thread.Sleep(200); Assert.Equal(TaskStatus.Running, task.Status); monitor.Stop(); - Assert.True(task.Wait(TimeSpan.FromMilliseconds(1000))); + var completedTask = await Task.WhenAny(task, Task.Delay(1000)); + Assert.Equal(task, completedTask); } } -#endif + [Fact] public void NoHangWhenMonitoringUnboundInprocAddress() @@ -126,7 +127,7 @@ public void ErrorCodeTest() } [Fact] - public void MonitorDisposeProperlyWhenDisposedAfterMonitoredTcpSocket() + public async Task MonitorDisposeProperlyWhenDisposedAfterMonitoredTcpSocket() { // The bug: // Given we monitor a netmq tcp socket @@ -141,7 +142,7 @@ public void MonitorDisposeProperlyWhenDisposedAfterMonitoredTcpSocket() using (var req = new RequestSocket()) { monitor = new NetMQMonitor(req, "inproc://#monitor", SocketEvents.All); - Task.Factory.StartNew(monitor.Start); + _ = Task.Factory.StartNew(monitor.Start); // Bug only occurs when monitoring a tcp socket var port = res.BindRandomPort("tcp://127.0.0.1"); @@ -152,10 +153,12 @@ public void MonitorDisposeProperlyWhenDisposedAfterMonitoredTcpSocket() res.SendFrame("response"); Assert.Equal("response", req.ReceiveFrameString()); } - Thread.Sleep(100); + + await Task.Delay(100); // Monitor.Dispose should complete - var completed = Task.Factory.StartNew(() => monitor.Dispose()).Wait(1000); - Assert.True(completed); + var task = Task.Factory.StartNew(() => monitor.Dispose()); + var completedTask = await Task.WhenAny(task, Task.Delay(1000)); + Assert.Equal(task, completedTask); } // NOTE If this test fails, it will hang because context.Dispose will block } diff --git a/src/NetMQ.Tests/NetMQPollerTest.cs b/src/NetMQ.Tests/NetMQPollerTest.cs index f49030732..ba0d34abe 100644 --- a/src/NetMQ.Tests/NetMQPollerTest.cs +++ b/src/NetMQ.Tests/NetMQPollerTest.cs @@ -10,6 +10,7 @@ #if !NET35 using System.Collections.Concurrent; +using System.Collections.Generic; #endif // ReSharper disable AccessToDisposedClosure @@ -865,7 +866,7 @@ public void NativeSocket() #if !NET35 [Fact] - public void OneTask() + public async Task OneTask() { bool triggered = false; @@ -879,14 +880,14 @@ public void OneTask() Assert.True(poller.CanExecuteTaskInline, "Should be on NetMQPoller thread"); }); task.Start(poller); - task.Wait(); + await task; Assert.True(triggered); } } [Fact] - public void SetsCurrentTaskScheduler() + public async Task SetsCurrentTaskScheduler() { using (var poller = new NetMQPoller()) { @@ -894,12 +895,12 @@ public void SetsCurrentTaskScheduler() var task = new Task(() => Assert.Same(TaskScheduler.Current, poller)); task.Start(poller); - task.Wait(); + await task; } } [Fact] - public void CanExecuteTaskInline() + public async Task CanExecuteTaskInline() { using (var poller = new NetMQPoller()) { @@ -911,12 +912,12 @@ public void CanExecuteTaskInline() var task = new Task(() => Assert.True(poller.CanExecuteTaskInline)); task.Start(poller); - task.Wait(); + await task; } } [Fact] - public void ContinueWith() + public async Task ContinueWith() { int threadId1 = 0; int threadId2 = 1; @@ -941,8 +942,7 @@ public void ContinueWith() }, poller); task.Start(poller); - task.Wait(); - task2.Wait(); + await Task.WhenAll(new List{task, task2}); Assert.Equal(threadId1, threadId2); Assert.Equal(1, runCount1); @@ -951,7 +951,7 @@ public void ContinueWith() } [Fact] - public void TwoThreads() + public async Task TwoThreads() { int count1 = 0; int count2 = 0; @@ -982,9 +982,8 @@ public void TwoThreads() } }); - t1.Wait(1000); - t2.Wait(1000); - Task.WaitAll(allTasks.ToArray(), 1000); + await Task.WhenAny(Task.WhenAll(new List{ t1, t2 }), Task.Delay(1000)); + await Task.WhenAny(Task.WhenAll(allTasks.ToArray()), Task.Delay(1000)); Assert.Equal(100, count1); Assert.Equal(100, count2); diff --git a/src/NetMQ.Tests/XPubSubTests.cs b/src/NetMQ.Tests/XPubSubTests.cs index 14d730e7e..e7c65ab68 100644 --- a/src/NetMQ.Tests/XPubSubTests.cs +++ b/src/NetMQ.Tests/XPubSubTests.cs @@ -332,7 +332,7 @@ public void Manual() sub.SendFrame(new byte[] { 1, (byte)'A' }); var subscription = pub.ReceiveFrameBytes(); - Assert.Equal(subscription[1], (byte)'A'); + Assert.Equal((byte)'A', subscription[1]); pub.Subscribe("B"); pub.SendFrame("A"); @@ -356,7 +356,7 @@ public void WelcomeMessage() var subscription = pub.ReceiveFrameBytes(); - Assert.Equal(subscription[1], (byte)'W'); + Assert.Equal((byte)'W', subscription[1]); Assert.Equal("W", sub.ReceiveFrameString()); } @@ -377,7 +377,7 @@ public void ClearWelcomeMessage() var subscription = pub.ReceiveFrameBytes(); - Assert.Equal(subscription[1], (byte)'W'); + Assert.Equal( (byte)'W', subscription[1]); Assert.False(sub.TrySkipFrame()); } diff --git a/src/NetMQ/Core/Transports/Tcp/TcpConnector.cs b/src/NetMQ/Core/Transports/Tcp/TcpConnector.cs index 63bda2cad..dedce2617 100755 --- a/src/NetMQ/Core/Transports/Tcp/TcpConnector.cs +++ b/src/NetMQ/Core/Transports/Tcp/TcpConnector.cs @@ -206,7 +206,7 @@ private void StartConnecting() // TerminatingException can occur in above call to EventConnectDelayed via // MonitorEvent.Write if corresponding PairSocket has been sent Term command catch (TerminatingException) - {} + { } } /// @@ -236,9 +236,12 @@ public void OutCompleted(SocketError socketError, int bytesTransferred) m_ioObject.RemoveSocket(m_s); m_handleValid = false; - try { + try + { m_s.NoDelay = true; - } catch (ArgumentException) { + } + catch (ArgumentException) + { // OSX sometime fail while the socket is still connecting } @@ -259,7 +262,16 @@ public void OutCompleted(SocketError socketError, int bytesTransferred) bytes.PutInteger(endian, m_options.TcpKeepaliveIdle, 4); bytes.PutInteger(endian, m_options.TcpKeepaliveIntvl, 8); + bytes.PutInteger(endian, m_options.TcpKeepaliveIntvl, 8); +#if NET + if (!OperatingSystem.IsWindows()) + { + throw new InvalidOperationException("Not supported on you platform"); // There is a pull request for .net8.0 + + } +#endif m_s.IOControl(IOControlCode.KeepAliveValues, (byte[])bytes, null); + } } diff --git a/src/NetMQ/Core/Transports/Tcp/TcpListener.cs b/src/NetMQ/Core/Transports/Tcp/TcpListener.cs index 96ececc41..3997ecd83 100644 --- a/src/NetMQ/Core/Transports/Tcp/TcpListener.cs +++ b/src/NetMQ/Core/Transports/Tcp/TcpListener.cs @@ -45,12 +45,12 @@ internal class TcpListener : Own, IProactorEvents /// private AsyncSocket? m_handle; -/* - /// - /// socket being accepted - /// - private AsyncSocket m_acceptedSocket; -*/ + /* + /// + /// socket being accepted + /// + private AsyncSocket m_acceptedSocket; + */ /// /// Socket the listener belongs to. @@ -107,7 +107,7 @@ protected override void ProcessPlug() protected override void ProcessTerm(int linger) { Assumes.NotNull(m_handle); - + m_ioObject.SetHandler(this); m_ioObject.RemoveSocket(m_handle); Close(); @@ -123,7 +123,7 @@ public virtual void SetAddress(string addr) m_address.Resolve(addr, m_options.IPv4Only); Assumes.NotNull(m_address.Address); - + try { @@ -195,68 +195,75 @@ public void InCompleted(SocketError socketError, int bytesTransferred) switch (socketError) { case SocketError.Success: - { - // TODO: check TcpFilters - var acceptedSocket = m_handle.GetAcceptedSocket(); + { + // TODO: check TcpFilters + var acceptedSocket = m_handle.GetAcceptedSocket(); acceptedSocket.NoDelay = true; - if (m_options.TcpKeepalive != -1) - { - acceptedSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, m_options.TcpKeepalive); - - if (m_options.TcpKeepaliveIdle != -1 && m_options.TcpKeepaliveIntvl != -1) + if (m_options.TcpKeepalive != -1) { - var bytes = new ByteArraySegment(new byte[12]); + acceptedSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, m_options.TcpKeepalive); + + if (m_options.TcpKeepaliveIdle != -1 && m_options.TcpKeepaliveIntvl != -1) + { + var bytes = new ByteArraySegment(new byte[12]); + + Endianness endian = BitConverter.IsLittleEndian ? Endianness.Little : Endianness.Big; - Endianness endian = BitConverter.IsLittleEndian ? Endianness.Little : Endianness.Big; + bytes.PutInteger(endian, m_options.TcpKeepalive, 0); + bytes.PutInteger(endian, m_options.TcpKeepaliveIdle, 4); + bytes.PutInteger(endian, m_options.TcpKeepaliveIntvl, 8); +#if NET + if (!OperatingSystem.IsWindows()) + { + throw new InvalidOperationException("Not supported on you platform"); // There is a pull request for .net8.0 - bytes.PutInteger(endian, m_options.TcpKeepalive, 0); - bytes.PutInteger(endian, m_options.TcpKeepaliveIdle, 4); - bytes.PutInteger(endian, m_options.TcpKeepaliveIntvl, 8); + } +#endif + acceptedSocket.IOControl(IOControlCode.KeepAliveValues, (byte[])bytes, null); - acceptedSocket.IOControl(IOControlCode.KeepAliveValues, (byte[])bytes, null); + } } - } - // Create the engine object for this connection. - var engine = new StreamEngine(acceptedSocket, m_options, m_endpoint); + // Create the engine object for this connection. + var engine = new StreamEngine(acceptedSocket, m_options, m_endpoint); - // Choose I/O thread to run connector in. Given that we are already - // running in an I/O thread, there must be at least one available. - IOThread? ioThread = ChooseIOThread(m_options.Affinity); + // Choose I/O thread to run connector in. Given that we are already + // running in an I/O thread, there must be at least one available. + IOThread? ioThread = ChooseIOThread(m_options.Affinity); - Assumes.NotNull(ioThread); + Assumes.NotNull(ioThread); - // Create and launch a session object. - // TODO: send null in address parameter, is unneeded in this case - SessionBase session = SessionBase.Create(ioThread, false, m_socket, m_options, new Address(m_handle.LocalEndPoint)); - session.IncSeqnum(); - LaunchChild(session); + // Create and launch a session object. + // TODO: send null in address parameter, is unneeded in this case + SessionBase session = SessionBase.Create(ioThread, false, m_socket, m_options, new Address(m_handle.LocalEndPoint)); + session.IncSeqnum(); + LaunchChild(session); - SendAttach(session, engine, false); + SendAttach(session, engine, false); - m_socket.EventAccepted(m_endpoint, acceptedSocket); + m_socket.EventAccepted(m_endpoint, acceptedSocket); - Accept(); - break; - } + Accept(); + break; + } case SocketError.ConnectionReset: case SocketError.NoBufferSpaceAvailable: case SocketError.TooManyOpenSockets: - { - m_socket.EventAcceptFailed(m_endpoint, socketError.ToErrorCode()); + { + m_socket.EventAcceptFailed(m_endpoint, socketError.ToErrorCode()); - Accept(); - break; - } + Accept(); + break; + } default: - { - NetMQException exception = NetMQException.Create(socketError); + { + NetMQException exception = NetMQException.Create(socketError); - m_socket.EventAcceptFailed(m_endpoint, exception.ErrorCode); - throw exception; - } + m_socket.EventAcceptFailed(m_endpoint, exception.ErrorCode); + throw exception; + } } } diff --git a/src/NetMQ/Core/Utils/OpCode.cs b/src/NetMQ/Core/Utils/OpCode.cs index 1cf2f3b92..181baae1a 100644 --- a/src/NetMQ/Core/Utils/OpCode.cs +++ b/src/NetMQ/Core/Utils/OpCode.cs @@ -39,24 +39,25 @@ public static bool Open() // Unix if (IsARMArchitecture()) return false; - Assembly assembly = Assembly.Load("Mono.Posix"); + Assembly assembly = Assembly.Load("Mono.Posix") ?? throw new InvalidOperationException("Mmap failed"); + Type syscall = assembly.GetType("Mono.Unix.Native.Syscall") ?? throw new InvalidOperationException("Mmap failed"); + MethodInfo mmap = syscall?.GetMethod("mmap") ?? throw new InvalidOperationException("Mmap failed"); - Type syscall = assembly.GetType("Mono.Unix.Native.Syscall"); - MethodInfo mmap = syscall.GetMethod("mmap"); + Type mmapProts = assembly?.GetType("Mono.Unix.Native.MmapProts") ?? throw new InvalidOperationException("Mmap failed"); - Type mmapProts = assembly.GetType("Mono.Unix.Native.MmapProts"); object mmapProtsParam = Enum.ToObject(mmapProts, - (int)mmapProts.GetField("PROT_READ").GetValue(null) | - (int)mmapProts.GetField("PROT_WRITE").GetValue(null) | - (int)mmapProts.GetField("PROT_EXEC").GetValue(null)); + (int)(mmapProts.GetField("PROT_READ")?.GetValue(null) ?? 0) | + (int)(mmapProts.GetField("PROT_WRITE")?.GetValue(null) ?? 0) | + (int)(mmapProts.GetField("PROT_EXEC")?.GetValue(null) ?? 0)); - Type mmapFlags = assembly.GetType("Mono.Unix.Native.MmapFlags"); + Type mmapFlags = assembly!.GetType("Mono.Unix.Native.MmapFlags") ?? + throw new InvalidOperationException("Mmap failed"); object mmapFlagsParam = Enum.ToObject(mmapFlags, - (int)mmapFlags.GetField("MAP_ANONYMOUS").GetValue(null) | - (int)mmapFlags.GetField("MAP_PRIVATE").GetValue(null)); + (int)(mmapFlags.GetField("MAP_ANONYMOUS")?.GetValue(null) ?? 0) | + (int)(mmapFlags.GetField("MAP_PRIVATE")?.GetValue(null) ?? 0)); s_codeBuffer = (IntPtr)mmap.Invoke(null, - new[] { IntPtr.Zero, s_size, mmapProtsParam, mmapFlagsParam, -1, 0 }); + new[] { IntPtr.Zero, s_size, mmapProtsParam, mmapFlagsParam, -1, 0 })!; if (s_codeBuffer == IntPtr.Zero || s_codeBuffer == (IntPtr)(-1)) { @@ -84,16 +85,17 @@ private static bool IsARMArchitecture() Assembly currentAssembly = Assembly.Load("Mono.Posix, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"); Type syscall = currentAssembly.GetType("Mono.Unix.Native.Syscall"); Type utsname = currentAssembly.GetType("Mono.Unix.Native.Utsname"); - MethodInfo uname = syscall.GetMethod("uname"); + if (syscall is null || utsname is null) return false; + MethodInfo? uname = syscall.GetMethod("uname"); object?[] parameters = { null }; - var invokeResult = (int)uname.Invoke(null, parameters); + var invokeResult = (int) (uname?.Invoke(null, parameters) ?? -1); if (invokeResult != 0) return false; var currentValues = parameters[0]; - var machineValue = (string)utsname.GetField("machine").GetValue(currentValues); + var machineValue = (string)(utsname!.GetField("machine")?.GetValue(currentValues) ?? "unknown"); return machineValue.ToLower().Contains("arm"); } diff --git a/src/NetMQ/NetMQSynchronizationContext.cs b/src/NetMQ/NetMQSynchronizationContext.cs index 54f863a83..871373928 100644 --- a/src/NetMQ/NetMQSynchronizationContext.cs +++ b/src/NetMQ/NetMQSynchronizationContext.cs @@ -1,7 +1,7 @@ using System.Threading; using System.Threading.Tasks; -#if !NET35 + namespace NetMQ { internal sealed class NetMQSynchronizationContext : SynchronizationContext @@ -14,14 +14,14 @@ public NetMQSynchronizationContext(NetMQPoller poller) } /// Dispatches an asynchronous message to a synchronization context. - public override void Post(SendOrPostCallback d, object state) + public override void Post(SendOrPostCallback d, object? state) { var task = new Task(() => d(state)); task.Start(m_poller); } /// Dispatches a synchronous message to a synchronization context. - public override void Send(SendOrPostCallback d, object state) + public override void Send(SendOrPostCallback d, object? state) { var task = new Task(() => d(state)); task.Start(m_poller); @@ -29,4 +29,3 @@ public override void Send(SendOrPostCallback d, object state) } } } -#endif \ No newline at end of file From 1f36ea1e5c943f2980dd0cab3d00fb75e215ef6c Mon Sep 17 00:00:00 2001 From: Christoph Bauer Date: Thu, 12 Jun 2025 16:06:00 +0200 Subject: [PATCH 05/14] Warnings fixed --- src/NetMQ.Tests/ClientServer.cs | 4 ++-- src/NetMQ.Tests/NetMQPollerTest.cs | 6 +++--- src/NetMQ.Tests/NetMQQueueTests.cs | 6 +++--- src/NetMQ.Tests/PgmTests.cs | 12 ++++++------ src/NetMQ.Tests/RadioDish.cs | 5 +++-- src/NetMQ.Tests/ScatterGather.cs | 3 ++- src/NetMQ.Tests/SocketTests.cs | 4 ++-- src/NetMQ/Core/Address.cs | 12 +++++++----- src/NetMQ/Core/Transports/ByteArraySegment.cs | 2 +- src/NetMQ/Core/Transports/Tcp/TcpListener.cs | 8 ++++---- src/NetMQ/Core/Utils/ByteArrayEqualityComparer.cs | 4 +++- src/NetMQ/Core/Utils/Signaler.cs | 2 +- src/NetMQ/Msg.cs | 10 +++++++--- src/NetMQ/NetMQBeacon.cs | 5 +++-- src/NetMQ/NetMQFrame.cs | 2 +- src/NetMQ/NetMQPoller.cs | 6 +++--- src/NetMQ/NetMQQueue.cs | 7 ++++--- src/NetMQ/NetMQRuntime.cs | 4 ++-- src/NetMQ/RoutingKey.cs | 6 +++--- 19 files changed, 60 insertions(+), 48 deletions(-) diff --git a/src/NetMQ.Tests/ClientServer.cs b/src/NetMQ.Tests/ClientServer.cs index 8fad5621d..b9c651ea8 100644 --- a/src/NetMQ.Tests/ClientServer.cs +++ b/src/NetMQ.Tests/ClientServer.cs @@ -54,7 +54,7 @@ public void Tcp() } [Fact] - public async void Async() + public async Task Async() { using var server = new ServerSocket(); using var client = new ClientSocket(); @@ -72,7 +72,7 @@ public async void Async() } [Fact] - public async void AsyncWithCancellationToken() + public async Task AsyncWithCancellationToken() { using CancellationTokenSource source = new CancellationTokenSource(); using var server = new ServerSocket(); diff --git a/src/NetMQ.Tests/NetMQPollerTest.cs b/src/NetMQ.Tests/NetMQPollerTest.cs index ba0d34abe..6839eaf24 100644 --- a/src/NetMQ.Tests/NetMQPollerTest.cs +++ b/src/NetMQ.Tests/NetMQPollerTest.cs @@ -319,7 +319,7 @@ public void AddTwoSocketAfterRemoving() [Fact] - public void RemoveSocket() + public async Task RemoveSocket() { using (var router1 = new RouterSocket()) using (var router2 = new RouterSocket()) @@ -396,8 +396,8 @@ public void RemoveSocket() poller.Stop(); // await the pollerTask, 1ms should suffice - pollerTask.Wait(1); - Assert.True(pollerTask.IsCompleted); + var completedTask = await Task.WhenAny(pollerTask, Task.Delay(1)); + Assert.Equal(pollerTask, completedTask); } } diff --git a/src/NetMQ.Tests/NetMQQueueTests.cs b/src/NetMQ.Tests/NetMQQueueTests.cs index 9a26870df..d6d38ada4 100644 --- a/src/NetMQ.Tests/NetMQQueueTests.cs +++ b/src/NetMQ.Tests/NetMQQueueTests.cs @@ -24,7 +24,7 @@ public void EnqueueDequeue() } [Fact] - public void EnqueueShouldNotBlockWhenCapacityIsZero() + public async Task EnqueueShouldNotBlockWhenCapacityIsZero() { using (var mockSocket = new PairSocket()) using (var queue = new NetMQQueue()) @@ -39,8 +39,8 @@ public void EnqueueShouldNotBlockWhenCapacityIsZero() } }); - bool completed = task.Wait(TimeSpan.FromSeconds(1)); - Assert.True(completed, "Enqueue task should have completed " + socketWatermarkCapacity + " enqueue within 1 second"); + var completedTask = await Task.WhenAny(task, Task.Delay(1000)); + Assert.True(task == completedTask, "Enqueue task should have completed " + socketWatermarkCapacity + " enqueue within 1 second"); } } diff --git a/src/NetMQ.Tests/PgmTests.cs b/src/NetMQ.Tests/PgmTests.cs index 1dcc857ee..bf216679d 100644 --- a/src/NetMQ.Tests/PgmTests.cs +++ b/src/NetMQ.Tests/PgmTests.cs @@ -187,7 +187,7 @@ public void TwoPublishers() } [Fact(Skip = "Requires MSMQ for PGM sockets")] - public void Sending1000Messages() + public async Task Sending1000Messages() { // creating two different context and sending 1000 messages @@ -230,8 +230,8 @@ public void Sending1000Messages() } }); - pubTask.Wait(); - subTask.Wait(); + await pubTask; + await subTask; Assert.Equal(1000, count); } @@ -266,7 +266,7 @@ public void LargeMessage() [Theory(Skip = "Requires MSMQ for PGM sockets")] [InlineData("pgm://239.0.0.1:1000")] [InlineData("tcp://localhost:60000")] - public void SubscriberCleanupOnUnbind(string address) + public async Task SubscriberCleanupOnUnbind(string address) { for (var i = 0; i < 10; i++) { @@ -290,8 +290,8 @@ public void SubscriberCleanupOnUnbind(string address) // var duration = DateTime.Now - time; monitor.Stop(); - - monitorTask.Wait(); + + await monitorTask; } } } diff --git a/src/NetMQ.Tests/RadioDish.cs b/src/NetMQ.Tests/RadioDish.cs index 676f85d49..0c0a77e32 100644 --- a/src/NetMQ.Tests/RadioDish.cs +++ b/src/NetMQ.Tests/RadioDish.cs @@ -1,5 +1,6 @@ using System; using System.Threading; +using System.Threading.Tasks; using NetMQ.Sockets; using Xunit; using Xunit.Abstractions; @@ -47,7 +48,7 @@ public void TestBlocking() } [Fact] - public async void TestAsync() + public async Task TestAsync() { using var radio = new RadioSocket(); using var dish = new DishSocket(); @@ -56,7 +57,7 @@ public async void TestAsync() int port = radio.BindRandomPort("tcp://*"); dish.Connect($"tcp://127.0.0.1:{port}"); - Thread.Sleep(100); + await Task.Delay(100); await radio.SendAsync("1", "HELLO"); await radio.SendAsync("2", "HELLO"); diff --git a/src/NetMQ.Tests/ScatterGather.cs b/src/NetMQ.Tests/ScatterGather.cs index 6847c5961..affc82e44 100644 --- a/src/NetMQ.Tests/ScatterGather.cs +++ b/src/NetMQ.Tests/ScatterGather.cs @@ -1,4 +1,5 @@ using System.Threading; +using System.Threading.Tasks; using NetMQ.Sockets; using Xunit; @@ -47,7 +48,7 @@ public void TestBlocking() } [Fact] - public async void TestAsync() + public async Task TestAsync() { using var scatter = new ScatterSocket(); using var gather = new GatherSocket(); diff --git a/src/NetMQ.Tests/SocketTests.cs b/src/NetMQ.Tests/SocketTests.cs index 87072d62c..746d97a03 100644 --- a/src/NetMQ.Tests/SocketTests.cs +++ b/src/NetMQ.Tests/SocketTests.cs @@ -92,7 +92,7 @@ public void LargeMessage() } [Fact] - public void ReceiveMessageWithTimeout() + public async Task ReceiveMessageWithTimeout() { { var pubSync = new AutoResetEvent(false); @@ -134,7 +134,7 @@ public void ReceiveMessageWithTimeout() t1.Start(); t2.Start(); - Task.WaitAll(t1, t2); + await Task.WhenAll(t1, t2); } } diff --git a/src/NetMQ/Core/Address.cs b/src/NetMQ/Core/Address.cs index 223115bf3..2944035a5 100644 --- a/src/NetMQ/Core/Address.cs +++ b/src/NetMQ/Core/Address.cs @@ -18,6 +18,7 @@ You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ +using System.Diagnostics; using System.Net; namespace NetMQ.Core @@ -102,7 +103,8 @@ public Address(EndPoint endpoint) return; } - AddressString = endpoint.ToString(); + Debug.Assert(endpoint != null); + AddressString = endpoint.ToString()!; } @@ -112,9 +114,9 @@ public override string ToString() { switch (Protocol) { - case TcpProtocol: return Resolved.ToString(); - case IpcProtocol: return Resolved.ToString(); - case PgmProtocol: return Resolved.ToString(); + case TcpProtocol: return Resolved!.ToString()!; + case IpcProtocol: return Resolved!.ToString()!; + case PgmProtocol: return Resolved!.ToString()!; } } @@ -123,7 +125,7 @@ public override string ToString() return Protocol + "://" + AddressString; } - return base.ToString(); + return base.ToString()!; } public string Protocol { get; } diff --git a/src/NetMQ/Core/Transports/ByteArraySegment.cs b/src/NetMQ/Core/Transports/ByteArraySegment.cs index 6ea54160b..da990a5e4 100644 --- a/src/NetMQ/Core/Transports/ByteArraySegment.cs +++ b/src/NetMQ/Core/Transports/ByteArraySegment.cs @@ -413,7 +413,7 @@ public static explicit operator byte[](ByteArraySegment buffer) /// and has the same Offset property value /// and it's buffer points to the SAME byte-array as the otherObject does. /// - public override bool Equals(object otherObject) + public override bool Equals(object? otherObject) { var byteArraySegment = otherObject as ByteArraySegment; if (byteArraySegment != null) diff --git a/src/NetMQ/Core/Transports/Tcp/TcpListener.cs b/src/NetMQ/Core/Transports/Tcp/TcpListener.cs index 3997ecd83..5104e5a69 100644 --- a/src/NetMQ/Core/Transports/Tcp/TcpListener.cs +++ b/src/NetMQ/Core/Transports/Tcp/TcpListener.cs @@ -275,16 +275,16 @@ private void Close() if (m_handle == null) return; - Assumes.NotNull(m_endpoint); - try { m_handle.Dispose(); - m_socket.EventClosed(m_endpoint, m_handle); + if (m_endpoint is not null) + m_socket.EventClosed(m_endpoint, m_handle); } catch (SocketException ex) { - m_socket.EventCloseFailed(m_endpoint, ex.SocketErrorCode.ToErrorCode()); + if (m_endpoint is not null) + m_socket.EventCloseFailed(m_endpoint, ex.SocketErrorCode.ToErrorCode()); } m_handle = null; diff --git a/src/NetMQ/Core/Utils/ByteArrayEqualityComparer.cs b/src/NetMQ/Core/Utils/ByteArrayEqualityComparer.cs index 04203df37..f20353aaa 100644 --- a/src/NetMQ/Core/Utils/ByteArrayEqualityComparer.cs +++ b/src/NetMQ/Core/Utils/ByteArrayEqualityComparer.cs @@ -18,8 +18,10 @@ internal sealed class ByteArrayEqualityComparer : IEqualityComparer /// one of the two byte-arrays to compare /// the other byte-array to compare against /// - public bool Equals(byte[] x, byte[] y) + public bool Equals(byte[]? x, byte[]? y) { + if (x == y) return true; + if (x is null || y is null) return false; if (x.Length != y.Length) { return false; diff --git a/src/NetMQ/Core/Utils/Signaler.cs b/src/NetMQ/Core/Utils/Signaler.cs index 8183132f5..302a8ec20 100644 --- a/src/NetMQ/Core/Utils/Signaler.cs +++ b/src/NetMQ/Core/Utils/Signaler.cs @@ -50,7 +50,7 @@ public Signaler() m_writeSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Unspecified) { NoDelay = true }; - m_writeSocket.Connect(listener.LocalEndPoint); + m_writeSocket.Connect(listener.LocalEndPoint!); m_readSocket = listener.Accept(); } diff --git a/src/NetMQ/Msg.cs b/src/NetMQ/Msg.cs index e75c3b5f9..79e07ca0c 100644 --- a/src/NetMQ/Msg.cs +++ b/src/NetMQ/Msg.cs @@ -330,7 +330,7 @@ public byte[] ToArray() var data = new byte[Size]; if (Size > 0) - Buffer.BlockCopy(m_data, m_offset, data, 0, Size); + Buffer.BlockCopy(m_data!, m_offset, data, 0, Size); return data; } @@ -548,6 +548,7 @@ public override string ToString() /// The string public string GetString(Encoding encoding) { + Assumes.NotNull(m_data); return encoding.GetString(m_data, m_offset, Size); } @@ -560,6 +561,7 @@ public string GetString(Encoding encoding) /// The string public string GetString(Encoding encoding, int offset, int count) { + Assumes.NotNull(m_data); return encoding.GetString(m_data, m_offset + offset, count); } @@ -573,7 +575,7 @@ public void Put(byte[]? src, int dstOffset, int len) { if (len == 0 || src == null) return; - + Assumes.NotNull(m_data); Buffer.BlockCopy(src, 0, m_data, dstOffset, len); } @@ -587,6 +589,7 @@ public void Put(byte[]? src, int dstOffset, int len) public void Put(byte[]? src, int srcOffset, int dstOffset, int len) { if (len == 0 || src == null) return; + Assumes.NotNull(m_data); Buffer.BlockCopy(src, srcOffset, m_data, dstOffset, len); } @@ -619,6 +622,7 @@ public void Put(byte b, int i) /// The index to write the string to public void Put(Encoding encoding, string str, int index) { + Assumes.NotNull(m_data); encoding.GetBytes(str, 0, str.Length, m_data, m_offset + index); } /// @@ -728,7 +732,7 @@ public byte[] CloneData() var data = new byte[Size]; if (Size > 0) - Buffer.BlockCopy(m_data, m_offset, data, 0, Size); + Buffer.BlockCopy(m_data!, m_offset, data, 0, Size); return data; } diff --git a/src/NetMQ/NetMQBeacon.cs b/src/NetMQ/NetMQBeacon.cs index 6c224c053..c2b7558ea 100644 --- a/src/NetMQ/NetMQBeacon.cs +++ b/src/NetMQ/NetMQBeacon.cs @@ -144,7 +144,7 @@ private void Configure(string interfaceName, int port) } } - if (bindTo != null) + if (bindTo != null && sendTo != null) { m_broadcastAddress = new IPEndPoint(sendTo, m_udpPort); m_udpSocket.Bind(new IPEndPoint(bindTo, m_udpPort)); @@ -266,6 +266,7 @@ private void OnPipeReady(object sender, NetMQSocketEventArgs e) private void SendUdpFrame(NetMQFrame frame) { Assumes.NotNull(m_udpSocket); + Assumes.NotNull(m_broadcastAddress); try { @@ -299,7 +300,7 @@ private bool TryReceiveUdpFrame([NotNullWhen(returnValue: true)] out NetMQFrame? return false; } - peerName = peer.ToString(); + peerName = peer.ToString()!; frame = new NetMQFrame(buffer, bytesRead); return true; } diff --git a/src/NetMQ/NetMQFrame.cs b/src/NetMQ/NetMQFrame.cs index bf1ee3e47..cc312bcd1 100644 --- a/src/NetMQ/NetMQFrame.cs +++ b/src/NetMQ/NetMQFrame.cs @@ -268,7 +268,7 @@ bool IEquatable.Equals(NetMQFrame other) /// /// the Object to compare this to /// true only if the given Object is a NetMQFrame equal to this one - public override bool Equals(object obj) + public override bool Equals(object? obj) { return Equals(obj as NetMQFrame); } diff --git a/src/NetMQ/NetMQPoller.cs b/src/NetMQ/NetMQPoller.cs index 476d0c2c9..4df22c227 100644 --- a/src/NetMQ/NetMQPoller.cs +++ b/src/NetMQ/NetMQPoller.cs @@ -155,7 +155,7 @@ public NetMQPoller() // Try to dequeue and execute all pending tasks while (m_tasksQueue.TryDequeue(out Task? task, TimeSpan.Zero)) - TryExecuteTask(task); + TryExecuteTask(task!); }; m_sockets.Add(((ISocketPollable)m_tasksQueue).Socket); @@ -641,8 +641,8 @@ private void RunPoller() #if !NET35 // Try to dequeue and execute all pending tasks before stopping poller - while (m_tasksQueue.TryDequeue(out Task? task, TimeSpan.Zero)) - TryExecuteTask(task); + while (m_tasksQueue.TryDequeue(out Task? task, TimeSpan.Zero) ) + TryExecuteTask(task!); #endif } finally diff --git a/src/NetMQ/NetMQQueue.cs b/src/NetMQ/NetMQQueue.cs index d6c207774..3deec9231 100644 --- a/src/NetMQ/NetMQQueue.cs +++ b/src/NetMQ/NetMQQueue.cs @@ -94,7 +94,7 @@ public event EventHandler> ReceiveReady /// Will be filled with the item upon success /// Timeout to try and dequeue and item /// Will return false if it didn't succeed to dequeue an item after the timeout. - public bool TryDequeue([MaybeNull] out T result, TimeSpan timeout) + public bool TryDequeue(out T? result, TimeSpan timeout) { if (m_reader.TryReceive(ref m_dequeueMsg, timeout)) { @@ -111,11 +111,12 @@ public bool TryDequeue([MaybeNull] out T result, TimeSpan timeout) /// Dequeue an item from the queue, will block if queue is empty. Dequeueing and item is not thread safe. /// /// Dequeued item - public T Dequeue() + public T? Dequeue() { m_reader.TryReceive(ref m_dequeueMsg, SendReceiveConstants.InfiniteTimeout); - m_queue.TryDequeue(out T result); + m_queue.TryDequeue(out T? result); + return result; } diff --git a/src/NetMQ/NetMQRuntime.cs b/src/NetMQ/NetMQRuntime.cs index 7d03195bc..9e3fdb66e 100644 --- a/src/NetMQ/NetMQRuntime.cs +++ b/src/NetMQ/NetMQRuntime.cs @@ -14,7 +14,7 @@ public class NetMQRuntime : IDisposable { private NetMQPoller m_poller; private readonly NetMQSynchronizationContext m_synchronizationContext; - private readonly SynchronizationContext m_oldSynchronizationContext; + private readonly SynchronizationContext? m_oldSynchronizationContext; private static readonly ThreadLocal s_current = new ThreadLocal(); private readonly List m_sockets; @@ -36,7 +36,7 @@ public NetMQRuntime() /// public static NetMQRuntime Current { - get { return s_current.Value; } + get { return s_current.Value!; } } internal static NetMQPoller Poller diff --git a/src/NetMQ/RoutingKey.cs b/src/NetMQ/RoutingKey.cs index 68c3c1462..28c432a17 100644 --- a/src/NetMQ/RoutingKey.cs +++ b/src/NetMQ/RoutingKey.cs @@ -50,7 +50,7 @@ internal byte[] Bytes /// /// Object to compare against, valid types are byte-array and RoutingKey /// True if equals, otherwise false - public override bool Equals(object obj) + public override bool Equals(object? obj) { if (obj is RoutingKey) return Equals((RoutingKey) obj); @@ -66,9 +66,9 @@ public override bool Equals(object obj) /// /// Byte-array to compare against /// True if equals, otherwise false - public bool Equals(byte[] x) + public bool Equals(byte[]? x) { - if (bytes.Length != x.Length) + if (bytes.Length != x?.Length) { return false; } From fa221a72587d3e4495cb0309cbb817b2900e39fb Mon Sep 17 00:00:00 2001 From: Christoph Bauer Date: Thu, 12 Jun 2025 16:27:22 +0200 Subject: [PATCH 06/14] More Warnings fixed --- src/NetMQ.Tests/RouterTests.cs | 2 +- src/NetMQ/AsyncReceiveExtensions.cs | 6 +++--- src/NetMQ/Core/Address.cs | 2 +- src/NetMQ/Core/Patterns/Peer.cs | 4 ++-- src/NetMQ/Core/Patterns/Router.cs | 6 +++--- src/NetMQ/Core/Patterns/Stream.cs | 4 ++-- src/NetMQ/Core/SocketBase.cs | 4 ++-- src/NetMQ/Core/Transports/Pgm/PgmAddress.cs | 2 +- src/NetMQ/Core/Transports/Tcp/TcpAddress.cs | 2 +- src/NetMQ/Core/Utils/OpCode.cs | 12 ++++++------ src/NetMQ/Core/Utils/Poller.cs | 2 +- src/NetMQ/Monitoring/NetMQMonitor.cs | 2 +- src/NetMQ/NetMQActor.cs | 4 ++-- src/NetMQ/NetMQBeacon.cs | 8 ++++---- src/NetMQ/NetMQException.cs | 17 ++++++++++++++--- src/NetMQ/NetMQFrame.cs | 2 +- src/NetMQ/NetMQPoller.cs | 4 ++-- src/NetMQ/NetMQProactor.cs | 4 ++-- src/NetMQ/NetMQQueue.cs | 2 +- src/NetMQ/Proxy.cs | 4 ++-- 20 files changed, 52 insertions(+), 41 deletions(-) diff --git a/src/NetMQ.Tests/RouterTests.cs b/src/NetMQ.Tests/RouterTests.cs index 0633b6a71..a6b78e431 100644 --- a/src/NetMQ.Tests/RouterTests.cs +++ b/src/NetMQ.Tests/RouterTests.cs @@ -44,7 +44,7 @@ public void ReceiveReadyDot35Bug() using (var server = new RouterSocket()) { server.BindRandomPort("tcp://127.0.0.1"); - server.ReceiveReady += (s, e) => Assert.True(false, "Should not receive"); + server.ReceiveReady += (s, e) => Assert.Fail( "Should not receive"); Assert.False(server.Poll(TimeSpan.FromMilliseconds(1500))); } diff --git a/src/NetMQ/AsyncReceiveExtensions.cs b/src/NetMQ/AsyncReceiveExtensions.cs index 8a30d197d..b62ffbadc 100644 --- a/src/NetMQ/AsyncReceiveExtensions.cs +++ b/src/NetMQ/AsyncReceiveExtensions.cs @@ -91,7 +91,7 @@ public static async Task ReceiveMultipartMessageAsync( registration = cancellationToken.Register(PropagateCancel); } - void Listener(object sender, NetMQSocketEventArgs args) + void Listener(object? sender, NetMQSocketEventArgs args) { if (socket.TryReceive(ref msg, TimeSpan.Zero)) { @@ -174,7 +174,7 @@ void PropagateCancel() registration = cancellationToken.Register(PropagateCancel); } - void Listener(object sender, NetMQSocketEventArgs args) + void Listener(object? sender, NetMQSocketEventArgs args) { if (socket.TryReceive(ref msg, TimeSpan.Zero)) { @@ -241,7 +241,7 @@ public static Task SkipFrameAsync( registration = cancellationToken.Register(PropagateCancel); } - void Listener(object sender, NetMQSocketEventArgs args) + void Listener(object? sender, NetMQSocketEventArgs args) { if (socket.TryReceive(ref msg, TimeSpan.Zero)) { diff --git a/src/NetMQ/Core/Address.cs b/src/NetMQ/Core/Address.cs index 2944035a5..61cba3d0a 100644 --- a/src/NetMQ/Core/Address.cs +++ b/src/NetMQ/Core/Address.cs @@ -104,7 +104,7 @@ public Address(EndPoint endpoint) } Debug.Assert(endpoint != null); - AddressString = endpoint.ToString()!; + AddressString = endpoint!.ToString()!; } diff --git a/src/NetMQ/Core/Patterns/Peer.cs b/src/NetMQ/Core/Patterns/Peer.cs index ef08789f7..af6b87e3f 100644 --- a/src/NetMQ/Core/Patterns/Peer.cs +++ b/src/NetMQ/Core/Patterns/Peer.cs @@ -148,7 +148,7 @@ protected override void XAttachPipe(Pipe pipe, bool icanhasall) /// the Pipe that is being removed protected override void XTerminated(Pipe pipe) { - m_outpipes.TryGetValue(pipe.RoutingId, out Outpipe old); + m_outpipes.TryGetValue(pipe.RoutingId, out Outpipe? old); m_outpipes.Remove(pipe.RoutingId); Debug.Assert(old != null); @@ -208,7 +208,7 @@ protected override bool XSend(ref Msg msg) // Find the pipe associated with the routingId stored in the prefix. var routingId = BitConverter.ToUInt32(msg.UnsafeToArray(), 0); - if (m_outpipes.TryGetValue(routingId, out Outpipe op)) + if (m_outpipes.TryGetValue(routingId, out Outpipe? op)) { m_currentOut = op.Pipe; if (!m_currentOut.CheckWrite()) diff --git a/src/NetMQ/Core/Patterns/Router.cs b/src/NetMQ/Core/Patterns/Router.cs index b2eac0ec8..f1a2c530e 100644 --- a/src/NetMQ/Core/Patterns/Router.cs +++ b/src/NetMQ/Core/Patterns/Router.cs @@ -214,7 +214,7 @@ protected override void XTerminated(Pipe pipe) { Assumes.NotNull(pipe.Identity); - m_outpipes.TryGetValue(pipe.Identity, out Outpipe old); + m_outpipes.TryGetValue(pipe.Identity, out Outpipe? old); m_outpipes.Remove(pipe.Identity); Debug.Assert(old != null); @@ -290,7 +290,7 @@ protected override bool XSend(ref Msg msg) // mandatory is set. var identity = msg.UnsafeToArray(); - if (m_outpipes.TryGetValue(identity, out Outpipe op)) + if (m_outpipes.TryGetValue(identity, out Outpipe? op)) { m_currentOut = op.Pipe; if (!m_currentOut.CheckWrite()) @@ -556,7 +556,7 @@ private bool IdentifyPeer(Pipe pipe) msg.Close(); - if (m_outpipes.TryGetValue(identity, out Outpipe existPipe)) + if (m_outpipes.TryGetValue(identity, out Outpipe? existPipe)) { if (!m_handover) { diff --git a/src/NetMQ/Core/Patterns/Stream.cs b/src/NetMQ/Core/Patterns/Stream.cs index 6b3560615..0c83ed114 100644 --- a/src/NetMQ/Core/Patterns/Stream.cs +++ b/src/NetMQ/Core/Patterns/Stream.cs @@ -143,7 +143,7 @@ protected override void XTerminated(Pipe pipe) { Assumes.NotNull(pipe.Identity); - m_outpipes.TryGetValue(pipe.Identity, out Outpipe old); + m_outpipes.TryGetValue(pipe.Identity, out Outpipe? old); m_outpipes.Remove(pipe.Identity); Debug.Assert(old != null); @@ -206,7 +206,7 @@ protected override bool XSend(ref Msg msg) // mandatory is set. var identity = msg.UnsafeToArray(); - if (m_outpipes.TryGetValue(identity, out Outpipe op)) + if (m_outpipes.TryGetValue(identity, out Outpipe? op)) { m_currentOut = op.Pipe; if (!m_currentOut.CheckWrite()) diff --git a/src/NetMQ/Core/SocketBase.cs b/src/NetMQ/Core/SocketBase.cs index d2298fbda..40eddfffc 100644 --- a/src/NetMQ/Core/SocketBase.cs +++ b/src/NetMQ/Core/SocketBase.cs @@ -929,7 +929,7 @@ public void TermEndpoint(string addr) if (UnregisterEndpoint(addr, this)) return; - if (!m_inprocs.TryGetValue(addr, out Pipe pipe)) + if (!m_inprocs.TryGetValue(addr, out Pipe? pipe)) throw new EndpointNotFoundException("Endpoint was not found and cannot be disconnected"); pipe.SendDisconnectMessage(); @@ -938,7 +938,7 @@ public void TermEndpoint(string addr) } else { - if (!m_endpoints.TryGetValue(addr, out Endpoint endpoint)) + if (!m_endpoints.TryGetValue(addr, out Endpoint? endpoint)) throw new EndpointNotFoundException("Endpoint was not found and cannot be disconnected"); endpoint.Pipe?.Terminate(false); diff --git a/src/NetMQ/Core/Transports/Pgm/PgmAddress.cs b/src/NetMQ/Core/Transports/Pgm/PgmAddress.cs index 74f0486cf..f248a61a3 100644 --- a/src/NetMQ/Core/Transports/Pgm/PgmAddress.cs +++ b/src/NetMQ/Core/Transports/Pgm/PgmAddress.cs @@ -65,7 +65,7 @@ public void Resolve(string name, bool ip4Only) if (addrStr == "*") addrStr = "0.0.0.0"; - if (!IPAddress.TryParse(addrStr, out IPAddress ipAddress)) + if (!IPAddress.TryParse(addrStr, out IPAddress? ipAddress)) throw new InvalidException($"In PgmAddress.Resolve({name},{ip4Only}), addrStr ({addrStr}) must be a valid IPAddress."); this.Address = new IPEndPoint(ipAddress, port); diff --git a/src/NetMQ/Core/Transports/Tcp/TcpAddress.cs b/src/NetMQ/Core/Transports/Tcp/TcpAddress.cs index 49b118108..18e090ed5 100644 --- a/src/NetMQ/Core/Transports/Tcp/TcpAddress.cs +++ b/src/NetMQ/Core/Transports/Tcp/TcpAddress.cs @@ -91,7 +91,7 @@ public void Resolve(string name, bool ip4Only) } } - IPAddress ipAddress; + IPAddress? ipAddress; // Interpret * as Any. if (addrStr == "*") diff --git a/src/NetMQ/Core/Utils/OpCode.cs b/src/NetMQ/Core/Utils/OpCode.cs index 181baae1a..85e3d5625 100644 --- a/src/NetMQ/Core/Utils/OpCode.cs +++ b/src/NetMQ/Core/Utils/OpCode.cs @@ -17,7 +17,7 @@ public static bool Open() // While this is supported in modern CPUs, the technique used for allocating executable memory, copying OP Code // for the read of the time stamp and invoking the OP Code can be detected as Malware by some anti-virus vendors. // https://github.com/zeromq/netmq/issues/1071 - string val = Environment.GetEnvironmentVariable("NETQM_SUPPRESS_RDTSC"); + string? val = Environment.GetEnvironmentVariable("NETQM_SUPPRESS_RDTSC"); if (!string.IsNullOrEmpty(val)) return false; #if NETSTANDARD || NET @@ -83,8 +83,8 @@ private static bool IsARMArchitecture() { // force to load from mono gac Assembly currentAssembly = Assembly.Load("Mono.Posix, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"); - Type syscall = currentAssembly.GetType("Mono.Unix.Native.Syscall"); - Type utsname = currentAssembly.GetType("Mono.Unix.Native.Utsname"); + Type? syscall = currentAssembly.GetType("Mono.Unix.Native.Syscall"); + Type? utsname = currentAssembly.GetType("Mono.Unix.Native.Utsname"); if (syscall is null || utsname is null) return false; MethodInfo? uname = syscall.GetMethod("uname"); object?[] parameters = { null }; @@ -111,9 +111,9 @@ public static void Close() Assembly.Load("Mono.Posix, Version=2.0.0.0, Culture=neutral, " + "PublicKeyToken=0738eb9f132ed756"); - Type syscall = assembly.GetType("Mono.Unix.Native.Syscall"); - MethodInfo munmap = syscall.GetMethod("munmap"); - munmap.Invoke(null, new object[] { s_codeBuffer, s_size }); + Type? syscall = assembly.GetType("Mono.Unix.Native.Syscall"); + MethodInfo? munmap = syscall?.GetMethod("munmap"); + munmap?.Invoke(null, new object[] { s_codeBuffer, s_size }); } else { diff --git a/src/NetMQ/Core/Utils/Poller.cs b/src/NetMQ/Core/Utils/Poller.cs index b61bce148..1a7385ce1 100644 --- a/src/NetMQ/Core/Utils/Poller.cs +++ b/src/NetMQ/Core/Utils/Poller.cs @@ -167,7 +167,7 @@ public void AddHandle(Socket handle, IPollEvents events) /// the System.Net.Sockets.Socket to remove public void RemoveHandle(Socket handle) { - PollSet pollSet = m_addList.FirstOrDefault(p => p.Socket == handle); + PollSet? pollSet = m_addList.FirstOrDefault(p => p.Socket == handle); // If the socket was removed before being added there is no reason to mark retired, so just cancelling the socket and removing from add list. diff --git a/src/NetMQ/Monitoring/NetMQMonitor.cs b/src/NetMQ/Monitoring/NetMQMonitor.cs index a782ebd63..8c64ed00e 100644 --- a/src/NetMQ/Monitoring/NetMQMonitor.cs +++ b/src/NetMQ/Monitoring/NetMQMonitor.cs @@ -152,7 +152,7 @@ public NetMQMonitor(NetMQSocket socket, string endpoint, bool ownsSocket = false #endregion - private void Handle(object sender, NetMQSocketEventArgs socketEventArgs) + private void Handle(object? sender, NetMQSocketEventArgs socketEventArgs) { var monitorEvent = MonitorEvent.Read(m_monitoringSocket.SocketHandle); diff --git a/src/NetMQ/NetMQActor.cs b/src/NetMQ/NetMQActor.cs index 60e9159f0..055a43302 100644 --- a/src/NetMQ/NetMQActor.cs +++ b/src/NetMQ/NetMQActor.cs @@ -151,8 +151,8 @@ private NetMQActor(PairSocket self, PairSocket shim, IShimHandler shimHandler) var args = new NetMQActorEventArgs(this); - void OnReceive(object sender, NetMQSocketEventArgs e) => m_receiveEvent!.Fire(this, args); - void OnSend (object sender, NetMQSocketEventArgs e) => m_sendEvent !.Fire(this, args); + void OnReceive(object? sender, NetMQSocketEventArgs e) => m_receiveEvent!.Fire(this, args); + void OnSend (object? sender, NetMQSocketEventArgs e) => m_sendEvent !.Fire(this, args); m_receiveEvent = new EventDelegator( () => m_self.ReceiveReady += OnReceive, diff --git a/src/NetMQ/NetMQBeacon.cs b/src/NetMQ/NetMQBeacon.cs index c2b7558ea..63033b718 100644 --- a/src/NetMQ/NetMQBeacon.cs +++ b/src/NetMQ/NetMQBeacon.cs @@ -189,7 +189,7 @@ public void Run(PairSocket shim) #endif } - private void PingElapsed(object sender, NetMQTimerEventArgs e) + private void PingElapsed(object? sender, NetMQTimerEventArgs e) { Assumes.NotNull(m_transmit); @@ -201,7 +201,7 @@ private void OnUdpReady(Socket socket) Assumes.NotNull(m_pipe); if (!TryReceiveUdpFrame(out NetMQFrame? frame, out string? peerName)) - return; + return; // If filter is set, check that beacon matches it var isValid = frame.MessageSize >= m_filter?.MessageSize && Compare(frame, m_filter, m_filter.MessageSize); @@ -222,7 +222,7 @@ private void OnUdpReady(Socket socket) } } - private void OnPipeReady(object sender, NetMQSocketEventArgs e) + private void OnPipeReady(object? sender, NetMQSocketEventArgs e) { Assumes.NotNull(m_pipe); Assumes.NotNull(m_pingTimer); @@ -323,7 +323,7 @@ public NetMQBeacon() { m_actor = NetMQActor.Create(new Shim()); - void OnReceive(object sender, NetMQActorEventArgs e) => m_receiveEvent!.Fire(this, new NetMQBeaconEventArgs(this)); + void OnReceive(object? sender, NetMQActorEventArgs e) => m_receiveEvent!.Fire(this, new NetMQBeaconEventArgs(this)); m_receiveEvent = new EventDelegator( () => m_actor.ReceiveReady += OnReceive, diff --git a/src/NetMQ/NetMQException.cs b/src/NetMQ/NetMQException.cs index a42af6beb..66ea42460 100644 --- a/src/NetMQ/NetMQException.cs +++ b/src/NetMQ/NetMQException.cs @@ -25,7 +25,7 @@ public class NetMQException : Exception /// Create NetMQ Exception /// public NetMQException() - {} + { } /// /// Create a new NetMQ exception @@ -33,7 +33,7 @@ public NetMQException() /// public NetMQException(string message) : base(message) - {} + { } /// /// Create a new NetMQ exception @@ -42,23 +42,34 @@ public NetMQException(string message) /// public NetMQException(string message, Exception innerException) : base(message, innerException) - {} + { } /// Constructor for serialisation. protected NetMQException(SerializationInfo info, StreamingContext context) +#pragma warning disable SYSLIB0051 : base(info, context) +#pragma warning restore SYSLIB0051 { ErrorCode = (ErrorCode)info.GetInt32("ErrorCode"); } /// + +#if !NET + [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] +#endif +#pragma warning disable CS0672 // Member overrides obsolete member public override void GetObjectData(SerializationInfo info, StreamingContext context) +#pragma warning restore CS0672 // Member overrides obsolete member { info.AddValue("ErrorCode", ErrorCode); +#pragma warning disable SYSLIB0051 base.GetObjectData(info, context); +#pragma warning restore SYSLIB0051 } + #endregion /// diff --git a/src/NetMQ/NetMQFrame.cs b/src/NetMQ/NetMQFrame.cs index cc312bcd1..33f1d4192 100644 --- a/src/NetMQ/NetMQFrame.cs +++ b/src/NetMQ/NetMQFrame.cs @@ -258,7 +258,7 @@ public bool Equals(NetMQFrame? other) return true; } - bool IEquatable.Equals(NetMQFrame other) + bool IEquatable.Equals(NetMQFrame? other) { return Equals(other); } diff --git a/src/NetMQ/NetMQPoller.cs b/src/NetMQ/NetMQPoller.cs index 4df22c227..07d6522eb 100644 --- a/src/NetMQ/NetMQPoller.cs +++ b/src/NetMQ/NetMQPoller.cs @@ -633,7 +633,7 @@ private void RunPoller() else if (item.ResultEvent.HasError() || item.ResultEvent.HasIn()) { Assumes.NotNull(item.FileDescriptor); - if (m_pollinSockets.TryGetValue(item.FileDescriptor, out Action action)) + if (m_pollinSockets.TryGetValue(item.FileDescriptor, out Action? action)) action(item.FileDescriptor); } } @@ -687,7 +687,7 @@ public void StopAsync() #endregion - private void OnSocketEventsChanged(object sender, NetMQSocketEventArgs e) + private void OnSocketEventsChanged(object? sender, NetMQSocketEventArgs e) { // when the sockets SendReady or ReceiveReady changed we marked the poller as dirty in order to reset the poll events m_isPollSetDirty = true; diff --git a/src/NetMQ/NetMQProactor.cs b/src/NetMQ/NetMQProactor.cs index 017592fe7..67aa5e6a6 100644 --- a/src/NetMQ/NetMQProactor.cs +++ b/src/NetMQ/NetMQProactor.cs @@ -48,7 +48,7 @@ private void Run(PairSocket shim) m_receiveSocket.ReceiveReady -= OnSocketReady; } - private void OnShimReady(object sender, NetMQSocketEventArgs e) + private void OnShimReady(object? sender, NetMQSocketEventArgs e) { Assumes.NotNull(m_poller); @@ -59,7 +59,7 @@ private void OnShimReady(object sender, NetMQSocketEventArgs e) } } - private void OnSocketReady(object sender, NetMQSocketEventArgs e) + private void OnSocketReady(object? sender, NetMQSocketEventArgs e) { NetMQMessage message = m_receiveSocket.ReceiveMultipartMessage(); diff --git a/src/NetMQ/NetMQQueue.cs b/src/NetMQ/NetMQQueue.cs index 3deec9231..1b87eb2f7 100644 --- a/src/NetMQ/NetMQQueue.cs +++ b/src/NetMQ/NetMQQueue.cs @@ -57,7 +57,7 @@ public NetMQQueue(int capacity = 0) m_dequeueMsg.InitEmpty(); } - private void OnReceiveReady(object sender, NetMQSocketEventArgs e) + private void OnReceiveReady(object? sender, NetMQSocketEventArgs e) { m_eventDelegator.Fire(this, new NetMQQueueEventArgs(this)); } diff --git a/src/NetMQ/Proxy.cs b/src/NetMQ/Proxy.cs index fa9da7f9c..984e10bc7 100644 --- a/src/NetMQ/Proxy.cs +++ b/src/NetMQ/Proxy.cs @@ -114,8 +114,8 @@ public void Stop() m_state = StateStopped; } - private void OnFrontendReady(object sender, NetMQSocketEventArgs e) => ProxyBetween(m_frontend, m_backend, m_controlIn); - private void OnBackendReady (object sender, NetMQSocketEventArgs e) => ProxyBetween(m_backend, m_frontend, m_controlOut); + private void OnFrontendReady(object? sender, NetMQSocketEventArgs e) => ProxyBetween(m_frontend, m_backend, m_controlIn); + private void OnBackendReady (object? sender, NetMQSocketEventArgs e) => ProxyBetween(m_backend, m_frontend, m_controlOut); private static void ProxyBetween(IReceivingSocket from, IOutgoingSocket to, IOutgoingSocket? control) { From ce4ceb8613f729e0afa87971971ddb92a0f295a1 Mon Sep 17 00:00:00 2001 From: Christoph Bauer Date: Thu, 12 Jun 2025 16:39:55 +0200 Subject: [PATCH 07/14] update net47 -> net472 --- .github/workflows/CI.yml | 4 ++-- src/NetMQ.Tests/CurveTests.cs | 4 ++-- src/NetMQ.Tests/NetMQ.Tests.csproj | 8 ++++---- src/NetMQ.Tests/ZMTPTests.cs | 4 ++-- src/NetMQ/Core/Transports/Tcp/TcpConnector.cs | 1 - src/NetMQ/NetMQ.csproj | 4 ++-- src/NetMQ/NetMQBeacon.cs | 2 +- 7 files changed, 13 insertions(+), 14 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 80c4970a2..71796505f 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -34,8 +34,8 @@ jobs: run: dotnet build src/NetMQ.sln /p:Configuration=Release /verbosity:minimal - name: test net9.0 run: dotnet test -v n -p:ParallelizeTestCollections=false --configuration Release --no-build -f net9.0 src\NetMQ.Tests\NetMQ.Tests.csproj - - name: test net47 - run: dotnet test -v n -p:ParallelizeTestCollections=false --configuration Release --no-build -f net47 src\NetMQ.Tests\NetMQ.Tests.csproj + - name: test net472 + run: dotnet test -v n -p:ParallelizeTestCollections=false --configuration Release --no-build -f net472 src\NetMQ.Tests\NetMQ.Tests.csproj - name: coverage run: | OpenCover.Console.exe -register:user -target:"C:\Program Files\dotnet\dotnet.exe" -targetargs:"test --no-build --configuration Release -f net6.0 --logger:trx;LogFileName=results.trx /p:DebugType=full src\NetMQ.Tests\NetMQ.Tests.csproj" -filter:"+[NetMQ*]* -[NetMQ.Tests*]*" -output:".\NetMQ_coverage.xml" -oldStyle diff --git a/src/NetMQ.Tests/CurveTests.cs b/src/NetMQ.Tests/CurveTests.cs index 7d991abad..202d987ba 100644 --- a/src/NetMQ.Tests/CurveTests.cs +++ b/src/NetMQ.Tests/CurveTests.cs @@ -2,7 +2,7 @@ using NetMQ.Sockets; using Xunit; -#if NET47 +#if NETFRAMEWORK using ZeroMQ; #endif @@ -39,7 +39,7 @@ public void CurveTest() } -#if NET47 +#if NETFRAMEWORK [Fact] public void WithLibzmqClient() { diff --git a/src/NetMQ.Tests/NetMQ.Tests.csproj b/src/NetMQ.Tests/NetMQ.Tests.csproj index 0e1e5bcce..73ace4b5d 100644 --- a/src/NetMQ.Tests/NetMQ.Tests.csproj +++ b/src/NetMQ.Tests/NetMQ.Tests.csproj @@ -7,7 +7,7 @@ true true true - net9.0;net47 + net9.0;net472 @@ -20,13 +20,13 @@ /usr/lib/mono /usr/local/lib/mono - $(BaseFrameworkPathOverrideForMono)/4.7-api + $(BaseFrameworkPathOverrideForMono)/4.7-api $(FrameworkPathOverride)/Facades;$(AssemblySearchPaths) - + @@ -49,7 +49,7 @@ - + diff --git a/src/NetMQ.Tests/ZMTPTests.cs b/src/NetMQ.Tests/ZMTPTests.cs index 5efda7474..d33e519dd 100644 --- a/src/NetMQ.Tests/ZMTPTests.cs +++ b/src/NetMQ.Tests/ZMTPTests.cs @@ -10,7 +10,7 @@ using NetMQ.Sockets; using Xunit; -#if NET47 +#if NETFRAMEWORK using ZeroMQ; #endif @@ -156,7 +156,7 @@ public void V3Test() } } -#if NET47 +#if NETFRAMEWORK [Fact] public void WithLibzmq() { diff --git a/src/NetMQ/Core/Transports/Tcp/TcpConnector.cs b/src/NetMQ/Core/Transports/Tcp/TcpConnector.cs index dedce2617..cbc0a5b65 100755 --- a/src/NetMQ/Core/Transports/Tcp/TcpConnector.cs +++ b/src/NetMQ/Core/Transports/Tcp/TcpConnector.cs @@ -262,7 +262,6 @@ public void OutCompleted(SocketError socketError, int bytesTransferred) bytes.PutInteger(endian, m_options.TcpKeepaliveIdle, 4); bytes.PutInteger(endian, m_options.TcpKeepaliveIntvl, 8); - bytes.PutInteger(endian, m_options.TcpKeepaliveIntvl, 8); #if NET if (!OperatingSystem.IsWindows()) { diff --git a/src/NetMQ/NetMQ.csproj b/src/NetMQ/NetMQ.csproj index 7ea18d7b1..e6f95fa75 100644 --- a/src/NetMQ/NetMQ.csproj +++ b/src/NetMQ/NetMQ.csproj @@ -3,7 +3,7 @@ A 100% native C# port of the lightweight high performance messaging library ZeroMQ 4.0.0.0 - net8.0;net47;netstandard2.1 + net8.0;net472;netstandard2.1 portable ./NetMQ.snk true @@ -24,7 +24,7 @@ true - + true diff --git a/src/NetMQ/NetMQBeacon.cs b/src/NetMQ/NetMQBeacon.cs index 63033b718..145d3e43b 100644 --- a/src/NetMQ/NetMQBeacon.cs +++ b/src/NetMQ/NetMQBeacon.cs @@ -125,7 +125,7 @@ private void Configure(string interfaceName, int port) // on linux to receive broadcast you must bind to the broadcast address specifically //bindTo = @interface.Address; sendTo = @interface.BroadcastAddress; -#if NET45 || NET47 +#if NETFRAMEWORK if (Environment.OSVersion.Platform==PlatformID.Unix) #else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) From c953ae8f845b119e1f7b007835ca26a1da5436ce Mon Sep 17 00:00:00 2001 From: Christoph Bauer Date: Thu, 12 Jun 2025 16:44:49 +0200 Subject: [PATCH 08/14] Revert Reformating --- src/NetMQ/Core/Transports/Tcp/TcpConnector.cs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/NetMQ/Core/Transports/Tcp/TcpConnector.cs b/src/NetMQ/Core/Transports/Tcp/TcpConnector.cs index cbc0a5b65..5b4c6c215 100755 --- a/src/NetMQ/Core/Transports/Tcp/TcpConnector.cs +++ b/src/NetMQ/Core/Transports/Tcp/TcpConnector.cs @@ -206,7 +206,7 @@ private void StartConnecting() // TerminatingException can occur in above call to EventConnectDelayed via // MonitorEvent.Write if corresponding PairSocket has been sent Term command catch (TerminatingException) - { } + {} } /// @@ -236,12 +236,9 @@ public void OutCompleted(SocketError socketError, int bytesTransferred) m_ioObject.RemoveSocket(m_s); m_handleValid = false; - try - { + try { m_s.NoDelay = true; - } - catch (ArgumentException) - { + } catch (ArgumentException) { // OSX sometime fail while the socket is still connecting } From 069c2da771be0c5a6d0f1220bc8aaa670f4526e0 Mon Sep 17 00:00:00 2001 From: Christoph Bauer Date: Thu, 12 Jun 2025 16:55:42 +0200 Subject: [PATCH 09/14] Nuget Update --- src/NetMQ.Tests/NetMQ.Tests.csproj | 2 +- src/NetMQ/Core/Transports/Tcp/TcpListener.cs | 99 ++++++++++---------- src/NetMQ/NetMQException.cs | 6 +- src/NetMQ/NetMQPoller.cs | 2 +- src/NetMQ/NetMQQueue.cs | 1 - 5 files changed, 54 insertions(+), 56 deletions(-) diff --git a/src/NetMQ.Tests/NetMQ.Tests.csproj b/src/NetMQ.Tests/NetMQ.Tests.csproj index 73ace4b5d..59193dee6 100644 --- a/src/NetMQ.Tests/NetMQ.Tests.csproj +++ b/src/NetMQ.Tests/NetMQ.Tests.csproj @@ -43,7 +43,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/NetMQ/Core/Transports/Tcp/TcpListener.cs b/src/NetMQ/Core/Transports/Tcp/TcpListener.cs index 5104e5a69..6a8b02ac0 100644 --- a/src/NetMQ/Core/Transports/Tcp/TcpListener.cs +++ b/src/NetMQ/Core/Transports/Tcp/TcpListener.cs @@ -45,12 +45,12 @@ internal class TcpListener : Own, IProactorEvents /// private AsyncSocket? m_handle; - /* - /// - /// socket being accepted - /// - private AsyncSocket m_acceptedSocket; - */ +/* + /// + /// socket being accepted + /// + private AsyncSocket m_acceptedSocket; +*/ /// /// Socket the listener belongs to. @@ -107,7 +107,7 @@ protected override void ProcessPlug() protected override void ProcessTerm(int linger) { Assumes.NotNull(m_handle); - + m_ioObject.SetHandler(this); m_ioObject.RemoveSocket(m_handle); Close(); @@ -123,7 +123,7 @@ public virtual void SetAddress(string addr) m_address.Resolve(addr, m_options.IPv4Only); Assumes.NotNull(m_address.Address); - + try { @@ -195,25 +195,25 @@ public void InCompleted(SocketError socketError, int bytesTransferred) switch (socketError) { case SocketError.Success: - { - // TODO: check TcpFilters - var acceptedSocket = m_handle.GetAcceptedSocket(); + { + // TODO: check TcpFilters + var acceptedSocket = m_handle.GetAcceptedSocket(); acceptedSocket.NoDelay = true; - if (m_options.TcpKeepalive != -1) - { - acceptedSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, m_options.TcpKeepalive); + if (m_options.TcpKeepalive != -1) + { + acceptedSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, m_options.TcpKeepalive); - if (m_options.TcpKeepaliveIdle != -1 && m_options.TcpKeepaliveIntvl != -1) - { - var bytes = new ByteArraySegment(new byte[12]); + if (m_options.TcpKeepaliveIdle != -1 && m_options.TcpKeepaliveIntvl != -1) + { + var bytes = new ByteArraySegment(new byte[12]); - Endianness endian = BitConverter.IsLittleEndian ? Endianness.Little : Endianness.Big; + Endianness endian = BitConverter.IsLittleEndian ? Endianness.Little : Endianness.Big; - bytes.PutInteger(endian, m_options.TcpKeepalive, 0); - bytes.PutInteger(endian, m_options.TcpKeepaliveIdle, 4); - bytes.PutInteger(endian, m_options.TcpKeepaliveIntvl, 8); + bytes.PutInteger(endian, m_options.TcpKeepalive, 0); + bytes.PutInteger(endian, m_options.TcpKeepaliveIdle, 4); + bytes.PutInteger(endian, m_options.TcpKeepaliveIntvl, 8); #if NET if (!OperatingSystem.IsWindows()) { @@ -221,49 +221,48 @@ public void InCompleted(SocketError socketError, int bytesTransferred) } #endif - acceptedSocket.IOControl(IOControlCode.KeepAliveValues, (byte[])bytes, null); - - } + acceptedSocket.IOControl(IOControlCode.KeepAliveValues, (byte[])bytes, null); } + } - // Create the engine object for this connection. - var engine = new StreamEngine(acceptedSocket, m_options, m_endpoint); + // Create the engine object for this connection. + var engine = new StreamEngine(acceptedSocket, m_options, m_endpoint); - // Choose I/O thread to run connector in. Given that we are already - // running in an I/O thread, there must be at least one available. - IOThread? ioThread = ChooseIOThread(m_options.Affinity); + // Choose I/O thread to run connector in. Given that we are already + // running in an I/O thread, there must be at least one available. + IOThread? ioThread = ChooseIOThread(m_options.Affinity); - Assumes.NotNull(ioThread); + Assumes.NotNull(ioThread); - // Create and launch a session object. - // TODO: send null in address parameter, is unneeded in this case - SessionBase session = SessionBase.Create(ioThread, false, m_socket, m_options, new Address(m_handle.LocalEndPoint)); - session.IncSeqnum(); - LaunchChild(session); + // Create and launch a session object. + // TODO: send null in address parameter, is unneeded in this case + SessionBase session = SessionBase.Create(ioThread, false, m_socket, m_options, new Address(m_handle.LocalEndPoint)); + session.IncSeqnum(); + LaunchChild(session); - SendAttach(session, engine, false); + SendAttach(session, engine, false); - m_socket.EventAccepted(m_endpoint, acceptedSocket); + m_socket.EventAccepted(m_endpoint, acceptedSocket); - Accept(); - break; - } + Accept(); + break; + } case SocketError.ConnectionReset: case SocketError.NoBufferSpaceAvailable: case SocketError.TooManyOpenSockets: - { - m_socket.EventAcceptFailed(m_endpoint, socketError.ToErrorCode()); + { + m_socket.EventAcceptFailed(m_endpoint, socketError.ToErrorCode()); - Accept(); - break; - } + Accept(); + break; + } default: - { - NetMQException exception = NetMQException.Create(socketError); + { + NetMQException exception = NetMQException.Create(socketError); - m_socket.EventAcceptFailed(m_endpoint, exception.ErrorCode); - throw exception; - } + m_socket.EventAcceptFailed(m_endpoint, exception.ErrorCode); + throw exception; + } } } diff --git a/src/NetMQ/NetMQException.cs b/src/NetMQ/NetMQException.cs index 66ea42460..a593fcc16 100644 --- a/src/NetMQ/NetMQException.cs +++ b/src/NetMQ/NetMQException.cs @@ -25,7 +25,7 @@ public class NetMQException : Exception /// Create NetMQ Exception /// public NetMQException() - { } + {} /// /// Create a new NetMQ exception @@ -33,7 +33,7 @@ public NetMQException() /// public NetMQException(string message) : base(message) - { } + {} /// /// Create a new NetMQ exception @@ -42,7 +42,7 @@ public NetMQException(string message) /// public NetMQException(string message, Exception innerException) : base(message, innerException) - { } + {} /// Constructor for serialisation. protected NetMQException(SerializationInfo info, StreamingContext context) diff --git a/src/NetMQ/NetMQPoller.cs b/src/NetMQ/NetMQPoller.cs index 07d6522eb..292e3b680 100644 --- a/src/NetMQ/NetMQPoller.cs +++ b/src/NetMQ/NetMQPoller.cs @@ -641,7 +641,7 @@ private void RunPoller() #if !NET35 // Try to dequeue and execute all pending tasks before stopping poller - while (m_tasksQueue.TryDequeue(out Task? task, TimeSpan.Zero) ) + while (m_tasksQueue.TryDequeue(out Task? task, TimeSpan.Zero)) TryExecuteTask(task!); #endif } diff --git a/src/NetMQ/NetMQQueue.cs b/src/NetMQ/NetMQQueue.cs index 1b87eb2f7..d13d55e0d 100644 --- a/src/NetMQ/NetMQQueue.cs +++ b/src/NetMQ/NetMQQueue.cs @@ -117,7 +117,6 @@ public bool TryDequeue(out T? result, TimeSpan timeout) m_queue.TryDequeue(out T? result); - return result; } From cb70c8a4df2bd4e3c799928759be9dfc32a54d33 Mon Sep 17 00:00:00 2001 From: Christoph Bauer Date: Fri, 13 Jun 2025 08:42:03 +0200 Subject: [PATCH 10/14] Net482 supports arm. Better Null Handling --- src/NetMQ/Core/Utils/OpCode.cs | 3 +-- src/NetMQ/NetMQPoller.cs | 6 ++---- src/NetMQ/NetMQQueue.cs | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/NetMQ/Core/Utils/OpCode.cs b/src/NetMQ/Core/Utils/OpCode.cs index 85e3d5625..c861d2e33 100644 --- a/src/NetMQ/Core/Utils/OpCode.cs +++ b/src/NetMQ/Core/Utils/OpCode.cs @@ -20,13 +20,12 @@ public static bool Open() string? val = Environment.GetEnvironmentVariable("NETQM_SUPPRESS_RDTSC"); if (!string.IsNullOrEmpty(val)) return false; -#if NETSTANDARD || NET + if (RuntimeInformation.ProcessArchitecture != Architecture.X86 && RuntimeInformation.ProcessArchitecture != Architecture.X64) { return false; // RDTSC instruction not supported } -#endif var p = (int)Environment.OSVersion.Platform; diff --git a/src/NetMQ/NetMQPoller.cs b/src/NetMQ/NetMQPoller.cs index 292e3b680..4addedb50 100644 --- a/src/NetMQ/NetMQPoller.cs +++ b/src/NetMQ/NetMQPoller.cs @@ -155,7 +155,7 @@ public NetMQPoller() // Try to dequeue and execute all pending tasks while (m_tasksQueue.TryDequeue(out Task? task, TimeSpan.Zero)) - TryExecuteTask(task!); + TryExecuteTask(task); }; m_sockets.Add(((ISocketPollable)m_tasksQueue).Socket); @@ -639,11 +639,9 @@ private void RunPoller() } } -#if !NET35 // Try to dequeue and execute all pending tasks before stopping poller while (m_tasksQueue.TryDequeue(out Task? task, TimeSpan.Zero)) - TryExecuteTask(task!); -#endif + TryExecuteTask(task); } finally { diff --git a/src/NetMQ/NetMQQueue.cs b/src/NetMQ/NetMQQueue.cs index d13d55e0d..0bd5f6487 100644 --- a/src/NetMQ/NetMQQueue.cs +++ b/src/NetMQ/NetMQQueue.cs @@ -94,7 +94,7 @@ public event EventHandler> ReceiveReady /// Will be filled with the item upon success /// Timeout to try and dequeue and item /// Will return false if it didn't succeed to dequeue an item after the timeout. - public bool TryDequeue(out T? result, TimeSpan timeout) + public bool TryDequeue([MaybeNullWhen(false)] out T result, TimeSpan timeout) { if (m_reader.TryReceive(ref m_dequeueMsg, timeout)) { From 881d52405ba72b6946a5847af0be19ca891575ae Mon Sep 17 00:00:00 2001 From: Christoph Bauer Date: Fri, 13 Jun 2025 08:43:56 +0200 Subject: [PATCH 11/14] Update src/NetMQ/NetMQException.cs Co-authored-by: Drew Noakes --- src/NetMQ/NetMQException.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NetMQ/NetMQException.cs b/src/NetMQ/NetMQException.cs index a593fcc16..a3a9eeac5 100644 --- a/src/NetMQ/NetMQException.cs +++ b/src/NetMQ/NetMQException.cs @@ -46,9 +46,9 @@ public NetMQException(string message, Exception innerException) /// Constructor for serialisation. protected NetMQException(SerializationInfo info, StreamingContext context) -#pragma warning disable SYSLIB0051 +#pragma warning disable SYSLIB0051 // Legacy serialization support APIs are obsolete : base(info, context) -#pragma warning restore SYSLIB0051 +#pragma warning restore SYSLIB0051 // Legacy serialization support APIs are obsolete { ErrorCode = (ErrorCode)info.GetInt32("ErrorCode"); } From 5f26dfdeb7cb7bf17dcd8f226cb8eef57b06dc78 Mon Sep 17 00:00:00 2001 From: Christoph Bauer Date: Fri, 13 Jun 2025 08:44:12 +0200 Subject: [PATCH 12/14] Update src/NetMQ/NetMQException.cs Co-authored-by: Drew Noakes --- src/NetMQ/NetMQException.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/NetMQ/NetMQException.cs b/src/NetMQ/NetMQException.cs index a3a9eeac5..eff516855 100644 --- a/src/NetMQ/NetMQException.cs +++ b/src/NetMQ/NetMQException.cs @@ -64,12 +64,11 @@ public override void GetObjectData(SerializationInfo info, StreamingContext cont #pragma warning restore CS0672 // Member overrides obsolete member { info.AddValue("ErrorCode", ErrorCode); -#pragma warning disable SYSLIB0051 +#pragma warning disable SYSLIB0051 // Legacy serialization support APIs are obsolete base.GetObjectData(info, context); -#pragma warning restore SYSLIB0051 +#pragma warning restore SYSLIB0051 // Legacy serialization support APIs are obsolete } - #endregion /// From e07b1a9d34ac84b381f88184869d3ee1a0a720b8 Mon Sep 17 00:00:00 2001 From: Christoph Bauer Date: Fri, 13 Jun 2025 08:51:26 +0200 Subject: [PATCH 13/14] NetMQRuntime Null Check for Current --- src/NetMQ/NetMQRuntime.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/NetMQ/NetMQRuntime.cs b/src/NetMQ/NetMQRuntime.cs index 9e3fdb66e..5631525fe 100644 --- a/src/NetMQ/NetMQRuntime.cs +++ b/src/NetMQ/NetMQRuntime.cs @@ -36,7 +36,14 @@ public NetMQRuntime() /// public static NetMQRuntime Current { - get { return s_current.Value!; } + get + { + var result = s_current.Value; + if (result == null) + throw new InvalidOperationException("NetMQRuntime.Current is not available on this thread. Ensure that a NetMQRuntime has been created."); + else + return result; + } } internal static NetMQPoller Poller @@ -52,7 +59,7 @@ public void Run(params Task[] tasks) { Run(CancellationToken.None, tasks); } - + internal void Add(NetMQSocket socket) { m_poller.Add(socket); From b88c9a0a7feef1dda91ef180507d4d8b3d78c04a Mon Sep 17 00:00:00 2001 From: Drew Noakes Date: Fri, 13 Jun 2025 22:29:45 +1000 Subject: [PATCH 14/14] Use throw expression --- src/NetMQ/NetMQRuntime.cs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/NetMQ/NetMQRuntime.cs b/src/NetMQ/NetMQRuntime.cs index 5631525fe..f709a3db3 100644 --- a/src/NetMQ/NetMQRuntime.cs +++ b/src/NetMQ/NetMQRuntime.cs @@ -36,14 +36,7 @@ public NetMQRuntime() /// public static NetMQRuntime Current { - get - { - var result = s_current.Value; - if (result == null) - throw new InvalidOperationException("NetMQRuntime.Current is not available on this thread. Ensure that a NetMQRuntime has been created."); - else - return result; - } + get => s_current.Value ?? throw new InvalidOperationException("NetMQRuntime.Current is not available on this thread. Ensure that a NetMQRuntime has been created."); } internal static NetMQPoller Poller