mirror of
https://bitbucket.org/anguist/ntpa
synced 2026-10-05 19:31:58 +00:00
Improved thread safety
This commit is contained in:
+39
-33
@@ -41,56 +41,62 @@ namespace Ntp.System
|
||||
{
|
||||
Error = 0,
|
||||
Exit,
|
||||
Reload,
|
||||
Refresh,
|
||||
Reload
|
||||
Notify
|
||||
}
|
||||
|
||||
#if __MonoCS__
|
||||
public static Signal Wait (string name, LogBase log)
|
||||
{
|
||||
UnixSignal sigterm, sigquit, sigint, sighup, sigusr1, sigusr2;
|
||||
UnixSignal[] signals = new UnixSignal[] {
|
||||
new UnixSignal (Signum.SIGTERM),
|
||||
new UnixSignal (Signum.SIGQUIT),
|
||||
new UnixSignal (Signum.SIGINT),
|
||||
new UnixSignal (Signum.SIGHUP),
|
||||
new UnixSignal (Signum.SIGUSR1)
|
||||
sigint = new UnixSignal (Signum.SIGINT),
|
||||
sigterm = new UnixSignal (Signum.SIGTERM),
|
||||
sigquit = new UnixSignal (Signum.SIGQUIT),
|
||||
sighup = new UnixSignal (Signum.SIGHUP),
|
||||
sigusr1 = new UnixSignal (Signum.SIGUSR1),
|
||||
sigusr2 = new UnixSignal (Signum.SIGUSR2)
|
||||
};
|
||||
|
||||
int sig = 0;
|
||||
int i = 0;
|
||||
while (true) {
|
||||
try {
|
||||
sig = UnixSignal.WaitAny (signals, -1);
|
||||
i = UnixSignal.WaitAny (signals, -1);
|
||||
} catch (Exception e) {
|
||||
log.WriteLine ("Error in Signum handling.", Severity.Error);
|
||||
log.WriteLine ("Unrecoverable error in UnixSignal.WaitAny()",
|
||||
Severity.Error);
|
||||
log.WriteLine (e, Severity.Trace);
|
||||
return Signal.Error;
|
||||
}
|
||||
|
||||
if (sig >= 0 && sig < signals.Length) {
|
||||
Signum signal = signals [sig].Signum;
|
||||
if (i < 0 || i >= signals.Length) {
|
||||
log.WriteLine (String.Format (
|
||||
"Received unknown signal {0}",
|
||||
signals [i].Signum.ToString ()),
|
||||
Severity.Warn);
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (signal) {
|
||||
case Signum.SIGINT:
|
||||
log.WriteLine ("Interrupted.", Severity.Notice);
|
||||
return Signal.Exit;
|
||||
case Signum.SIGTERM:
|
||||
log.WriteLine ("Received kill signal.", Severity.Notice);
|
||||
return Signal.Exit;
|
||||
case Signum.SIGQUIT:
|
||||
log.WriteLine ("Received quit signal.", Severity.Notice);
|
||||
return Signal.Exit;
|
||||
case Signum.SIGHUP:
|
||||
log.WriteLine ("Received log restart signal.", Severity.Debug);
|
||||
return Signal.Refresh;
|
||||
case Signum.SIGUSR1:
|
||||
log.WriteLine ("Received reload config signal.", Severity.Debug);
|
||||
return Signal.Reload;
|
||||
default:
|
||||
log.WriteLine ("Unknown signal received.", Severity.Warn);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
log.WriteLine ("Unknown signal received.", Severity.Warn);
|
||||
log.WriteLine (String.Format (
|
||||
"Received signal {0}",
|
||||
signals [i].Signum.ToString ()),
|
||||
Severity.Debug);
|
||||
|
||||
if (sigint.IsSet || sigterm.IsSet || sigquit.IsSet) {
|
||||
sigint.Reset ();
|
||||
sigterm.Reset ();
|
||||
sigquit.Reset ();
|
||||
return Signal.Exit;
|
||||
} else if (sighup.IsSet) {
|
||||
sighup.Reset ();
|
||||
return Signal.Refresh;
|
||||
} else if (sigusr1.IsSet) {
|
||||
sigusr1.Reset ();
|
||||
return Signal.Reload;
|
||||
} else if (sigusr2.IsSet) {
|
||||
sigusr2.Reset ();
|
||||
return Signal.Notify;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ namespace Ntp.System
|
||||
{
|
||||
public static class VersionInfo
|
||||
{
|
||||
public static readonly string Number = "0.4b";
|
||||
public static readonly string Number = "0.4.2b";
|
||||
|
||||
public static readonly string Text = "v" + Number;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user