diff --git a/src/Tgstation.Server.Host/System/PosixSignalHandler.cs b/src/Tgstation.Server.Host/System/PosixSignalHandler.cs index 93df0ae593..8e543c4a7f 100644 --- a/src/Tgstation.Server.Host/System/PosixSignalHandler.cs +++ b/src/Tgstation.Server.Host/System/PosixSignalHandler.cs @@ -8,7 +8,6 @@ using Mono.Unix; using Mono.Unix.Native; using Tgstation.Server.Host.Core; -using Tgstation.Server.Host.Utils; namespace Tgstation.Server.Host.System { @@ -17,21 +16,11 @@ namespace Tgstation.Server.Host.System /// sealed class PosixSignalHandler : IHostedService, IDisposable { - /// - /// Check for signals each time this amount of milliseconds pass. - /// - const int CheckDelayMs = 250; - /// /// The for the . /// readonly IServerControl serverControl; - /// - /// The for the . - /// - readonly IAsyncDelayer asyncDelayer; - /// /// The for the . /// @@ -51,12 +40,10 @@ namespace Tgstation.Server.Host.System /// Initializes a new instance of the class. /// /// The value of . - /// The value of . /// The value of . - public PosixSignalHandler(IServerControl serverControl, IAsyncDelayer asyncDelayer, ILogger logger) + public PosixSignalHandler(IServerControl serverControl, ILogger logger) { this.serverControl = serverControl ?? throw new ArgumentNullException(nameof(serverControl)); - this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer)); this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); cancellationTokenSource = new CancellationTokenSource(); @@ -100,17 +87,23 @@ namespace Tgstation.Server.Host.System logger.LogTrace("Started SignalChecker"); using var unixSignal = new UnixSignal(Signum.SIGUSR1); - if (!unixSignal.IsSet) - { - logger.LogTrace("Waiting for SIGUSR1..."); - var cancellationToken = cancellationTokenSource.Token; - while (!unixSignal.IsSet) - await asyncDelayer.Delay(TimeSpan.FromMilliseconds(CheckDelayMs), cancellationToken); + logger.LogTrace("Waiting for SIGUSR1..."); + var cancellationToken = cancellationTokenSource.Token; - logger.LogTrace("SIGUSR1 received!"); + var tcs = new TaskCompletionSource(); + using (cancellationToken.Register(() => tcs.TrySetCanceled(cancellationToken))) + { + ThreadPool.RegisterWaitForSingleObject( + unixSignal, + (o, timeout) => tcs.TrySetResult(), + null, + Timeout.Infinite, + true); + + await tcs.Task; } - else - logger.LogDebug("SIGUSR1 has already been sent"); + + logger.LogTrace("SIGUSR1 received!"); logger.LogTrace("Triggering graceful shutdown..."); await serverControl.GracefulShutdown(); diff --git a/tests/Tgstation.Server.Host.Tests.Signals/Program.cs b/tests/Tgstation.Server.Host.Tests.Signals/Program.cs index c60a40d3a9..033c4d6a56 100644 --- a/tests/Tgstation.Server.Host.Tests.Signals/Program.cs +++ b/tests/Tgstation.Server.Host.Tests.Signals/Program.cs @@ -9,7 +9,6 @@ using Moq; using Tgstation.Server.Host.Core; using Tgstation.Server.Host.Extensions; using Tgstation.Server.Host.System; -using Tgstation.Server.Host.Utils; namespace Tgstation.Server.Host.Tests.Signals { @@ -25,9 +24,7 @@ namespace Tgstation.Server.Host.Tests.Signals .Callback(() => tcs.SetResult()) .Returns(Task.CompletedTask); - var mockAsyncDelayer = new Mock(); - mockAsyncDelayer.Setup(x => x.Delay(It.IsAny(), It.IsAny())).Returns(Task.CompletedTask); - using var signalHandler = new PosixSignalHandler(mockServerControl.Object, mockAsyncDelayer.Object, Mock.Of>()); + using var signalHandler = new PosixSignalHandler(mockServerControl.Object, Mock.Of>()); Assert.IsFalse(tcs.Task.IsCompleted); @@ -43,7 +40,7 @@ namespace Tgstation.Server.Host.Tests.Signals await signalHandler.StopAsync(default).WithToken(cts.Token); Assert.IsFalse(tcs.Task.IsCompleted); - using var signalHandler2 = new PosixSignalHandler(mockServerControl.Object, mockAsyncDelayer.Object, Mock.Of>()); + using var signalHandler2 = new PosixSignalHandler(mockServerControl.Object, Mock.Of>()); await signalHandler2.StartAsync(default); using var cts2 = new CancellationTokenSource(TimeSpan.FromSeconds(20)); diff --git a/tests/Tgstation.Server.Host.Tests/System/TestPosixSignalHandler.cs b/tests/Tgstation.Server.Host.Tests/System/TestPosixSignalHandler.cs index 1ea6c67d38..80c5f0b5e0 100644 --- a/tests/Tgstation.Server.Host.Tests/System/TestPosixSignalHandler.cs +++ b/tests/Tgstation.Server.Host.Tests/System/TestPosixSignalHandler.cs @@ -20,15 +20,12 @@ namespace Tgstation.Server.Host.System.Tests [TestMethod] public void TestConstruction() { - Assert.ThrowsException(() => new PosixSignalHandler(null, null, null)); + Assert.ThrowsException(() => new PosixSignalHandler(null, null)); var mockServerControl = Mock.Of(); - Assert.ThrowsException(() => new PosixSignalHandler(mockServerControl, null, null)); + Assert.ThrowsException(() => new PosixSignalHandler(mockServerControl, null)); - var mockAsyncDelayer = Mock.Of(); - Assert.ThrowsException(() => new PosixSignalHandler(mockServerControl, mockAsyncDelayer, null)); - - new PosixSignalHandler(mockServerControl, mockAsyncDelayer, Mock.Of>()).Dispose(); + new PosixSignalHandler(mockServerControl, Mock.Of>()).Dispose(); } [TestMethod]