mirror of
https://github.com/tgstation/tgstation-server.git
synced 2026-08-25 22:17:51 +01:00
Use signal checking that works in Host.Watchdog
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user