From 5119ecfa0328964d46897b7b9d6dcc5d6ca8423a Mon Sep 17 00:00:00 2001 From: Jordan Dominion Date: Tue, 20 Jun 2023 08:22:07 -0400 Subject: [PATCH] Use signal checking that works in Host.Watchdog --- .../Watchdog.cs | 67 ++++++++++++------- 1 file changed, 44 insertions(+), 23 deletions(-) diff --git a/src/Tgstation.Server.Host.Watchdog/Watchdog.cs b/src/Tgstation.Server.Host.Watchdog/Watchdog.cs index c45a25b364..3b9ee3bc63 100644 --- a/src/Tgstation.Server.Host.Watchdog/Watchdog.cs +++ b/src/Tgstation.Server.Host.Watchdog/Watchdog.cs @@ -181,31 +181,52 @@ namespace Tgstation.Server.Host.Watchdog var processTask = tcs.Task; while (!processTask.IsCompleted) { - using var unixSignal = isWindows - ? null - : new UnixSignal(Signum.SIGUSR1); - var signalTcs = new TaskCompletionSource(); - - if (!isWindows) - ThreadPool.RegisterWaitForSingleObject( - unixSignal, - (o, timeout) => signalTcs.SetResult(null), - null, - Timeout.Infinite, - true); - - var signalTask = signalTcs.Task; - - var completedTask = await Task.WhenAny(processTask, signalTask); - if (completedTask == signalTask) + using var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); + async ValueTask CheckSignal() { - logger.LogInformation("Received SIGUSR1, forwarding to main TGS process!"); - var result = Syscall.kill(childPid, Signum.SIGUSR1); - if (result != 0) - logger.LogWarning( - new UnixIOException(Stdlib.GetLastError()), - "Failed to forward SIGUSR1!"); + if (isWindows) + return; + + try + { + using var unixSignal = new UnixSignal(Signum.SIGUSR1); + if (!unixSignal.IsSet) + { + logger.LogTrace("Waiting for SIGUSR1..."); + while (!unixSignal.IsSet) + await Task.Delay(TimeSpan.FromMilliseconds(250), cts.Token); + + logger.LogTrace("SIGUSR1 received!"); + } + else + logger.LogDebug("SIGUSR1 has already been sent"); + } + catch (OperationCanceledException) + { + } + } + + var checkerTask = CheckSignal(); + try + { + var signalTask = signalTcs.Task; + + var completedTask = await Task.WhenAny(processTask, signalTask); + if (completedTask == signalTask) + { + logger.LogInformation("Received SIGUSR1, forwarding to main TGS process!"); + var result = Syscall.kill(childPid, Signum.SIGUSR1); + if (result != 0) + logger.LogWarning( + new UnixIOException(Stdlib.GetLastError()), + "Failed to forward SIGUSR1!"); + } + } + finally + { + cts.Cancel(); + await checkerTask; } } }