Add a function to disable vibe.d's default signal handlers. Fixes #1333.
(cherry picked from commit 29fab2e10bb864a8aee694d4a9de8f26fab2363e)
This commit is contained in:
parent
508669b781
commit
77dc93baa7
|
@ -77,6 +77,8 @@ version (Windows)
|
||||||
*/
|
*/
|
||||||
int runEventLoop()
|
int runEventLoop()
|
||||||
{
|
{
|
||||||
|
setupSignalHandlers();
|
||||||
|
|
||||||
logDebug("Starting event loop.");
|
logDebug("Starting event loop.");
|
||||||
s_eventLoopRunning = true;
|
s_eventLoopRunning = true;
|
||||||
scope (exit) {
|
scope (exit) {
|
||||||
|
@ -766,6 +768,22 @@ body {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Disables the signal handlers usually set up by vibe.d.
|
||||||
|
|
||||||
|
During the first call to `runEventLoop`, vibe.d usually sets up a set of
|
||||||
|
event handlers for SIGINT, SIGTERM and SIGPIPE. Since in some situations
|
||||||
|
this can be undesirable, this function can be called before the first
|
||||||
|
invocation of the event loop to avoid this.
|
||||||
|
|
||||||
|
Calling this function after `runEventLoop` will have no effect.
|
||||||
|
*/
|
||||||
|
void disableDefaultSignalHandlers()
|
||||||
|
{
|
||||||
|
synchronized (st_threadsMutex)
|
||||||
|
s_disableSignalHandlers = true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Sets the effective user and group ID to the ones configured for privilege lowering.
|
Sets the effective user and group ID to the ones configured for privilege lowering.
|
||||||
|
|
||||||
|
@ -1453,6 +1471,7 @@ private {
|
||||||
|
|
||||||
string s_privilegeLoweringUserName;
|
string s_privilegeLoweringUserName;
|
||||||
string s_privilegeLoweringGroupName;
|
string s_privilegeLoweringGroupName;
|
||||||
|
__gshared bool s_disableSignalHandlers = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool getExitFlag()
|
private bool getExitFlag()
|
||||||
|
@ -1460,6 +1479,43 @@ private bool getExitFlag()
|
||||||
return s_exitEventLoop || atomicLoad(st_term);
|
return s_exitEventLoop || atomicLoad(st_term);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setupSignalHandlers()
|
||||||
|
{
|
||||||
|
__gshared bool s_setup = false;
|
||||||
|
|
||||||
|
// only initialize in main thread
|
||||||
|
synchronized (st_threadsMutex) {
|
||||||
|
if (s_setup) return;
|
||||||
|
s_setup = true;
|
||||||
|
|
||||||
|
if (s_disableSignalHandlers) return;
|
||||||
|
|
||||||
|
logTrace("setup signal handler");
|
||||||
|
version(Posix){
|
||||||
|
// support proper shutdown using signals
|
||||||
|
sigset_t sigset;
|
||||||
|
sigemptyset(&sigset);
|
||||||
|
sigaction_t siginfo;
|
||||||
|
siginfo.sa_handler = &onSignal;
|
||||||
|
siginfo.sa_mask = sigset;
|
||||||
|
siginfo.sa_flags = SA_RESTART;
|
||||||
|
sigaction(SIGINT, &siginfo, null);
|
||||||
|
sigaction(SIGTERM, &siginfo, null);
|
||||||
|
|
||||||
|
siginfo.sa_handler = &onBrokenPipe;
|
||||||
|
sigaction(SIGPIPE, &siginfo, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
version(Windows){
|
||||||
|
// WORKAROUND: we don't care about viral @nogc attribute here!
|
||||||
|
import std.traits;
|
||||||
|
signal(SIGABRT, cast(ParameterTypeTuple!signal[1])&onSignal);
|
||||||
|
signal(SIGTERM, cast(ParameterTypeTuple!signal[1])&onSignal);
|
||||||
|
signal(SIGINT, cast(ParameterTypeTuple!signal[1])&onSignal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// per process setup
|
// per process setup
|
||||||
shared static this()
|
shared static this()
|
||||||
{
|
{
|
||||||
|
@ -1489,30 +1545,6 @@ shared static this()
|
||||||
st_threadsMutex = new Mutex;
|
st_threadsMutex = new Mutex;
|
||||||
st_threadShutdownCondition = new Condition(st_threadsMutex);
|
st_threadShutdownCondition = new Condition(st_threadsMutex);
|
||||||
|
|
||||||
version(Posix){
|
|
||||||
logTrace("setup signal handler");
|
|
||||||
// support proper shutdown using signals
|
|
||||||
sigset_t sigset;
|
|
||||||
sigemptyset(&sigset);
|
|
||||||
sigaction_t siginfo;
|
|
||||||
siginfo.sa_handler = &onSignal;
|
|
||||||
siginfo.sa_mask = sigset;
|
|
||||||
siginfo.sa_flags = SA_RESTART;
|
|
||||||
sigaction(SIGINT, &siginfo, null);
|
|
||||||
sigaction(SIGTERM, &siginfo, null);
|
|
||||||
|
|
||||||
siginfo.sa_handler = &onBrokenPipe;
|
|
||||||
sigaction(SIGPIPE, &siginfo, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
version(Windows){
|
|
||||||
// WORKAROUND: we don't care about viral @nogc attribute here!
|
|
||||||
import std.traits;
|
|
||||||
signal(SIGABRT, cast(ParameterTypeTuple!signal[1])&onSignal);
|
|
||||||
signal(SIGTERM, cast(ParameterTypeTuple!signal[1])&onSignal);
|
|
||||||
signal(SIGINT, cast(ParameterTypeTuple!signal[1])&onSignal);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto thisthr = Thread.getThis();
|
auto thisthr = Thread.getThis();
|
||||||
thisthr.name = "Main";
|
thisthr.name = "Main";
|
||||||
assert(st_threads.length == 0, "Main thread not the first thread!?");
|
assert(st_threads.length == 0, "Main thread not the first thread!?");
|
||||||
|
|
Loading…
Reference in a new issue