Use signal checking that works in Host.Watchdog

This commit is contained in:
Jordan Dominion
2023-06-20 08:23:02 -04:00
parent 195c37479e
commit 5119ecfa03
+44 -23
View File
@@ -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<object>();
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;
}
}
}