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]