void init() { serverID.init(); setupSIGTRAPforGDB(); setupCoreSignals(); setupSignals( false ); Logstream::get().addGlobalTee( new RamLog("global") ); }
void setupSignalHandlers() { set_terminate( myTerminate ); set_new_handler( myNewHandler ); // SIGABRT is the only signal we want handled by signal handlers on both windows and posix. invariant( signal(SIGABRT, abruptQuit) != SIG_ERR ); #ifdef _WIN32 _set_purecall_handler( ::abort ); // TODO improve? setWindowsUnhandledExceptionFilter(); massert(10297, "Couldn't register Windows Ctrl-C handler", SetConsoleCtrlHandler(static_cast<PHANDLER_ROUTINE>(CtrlHandler), TRUE)); #else invariant( signal(SIGHUP , SIG_IGN ) != SIG_ERR ); invariant( signal(SIGUSR2, SIG_IGN ) != SIG_ERR ); invariant( signal(SIGPIPE, SIG_IGN) != SIG_ERR ); struct sigaction addrSignals; memset( &addrSignals, 0, sizeof( struct sigaction ) ); addrSignals.sa_sigaction = abruptQuitWithAddrSignal; sigemptyset( &addrSignals.sa_mask ); addrSignals.sa_flags = SA_SIGINFO; invariant( sigaction(SIGSEGV, &addrSignals, 0) == 0 ); invariant( sigaction(SIGBUS, &addrSignals, 0) == 0 ); invariant( sigaction(SIGILL, &addrSignals, 0) == 0 ); invariant( sigaction(SIGFPE, &addrSignals, 0) == 0 ); setupSIGTRAPforGDB(); // asyncSignals is a global variable listing the signals that should be handled by the // interrupt thread, once it is started via startSignalProcessingThread(). sigemptyset( &asyncSignals ); sigaddset( &asyncSignals, SIGHUP ); sigaddset( &asyncSignals, SIGINT ); sigaddset( &asyncSignals, SIGTERM ); sigaddset( &asyncSignals, SIGQUIT ); sigaddset( &asyncSignals, SIGUSR1 ); sigaddset( &asyncSignals, SIGXCPU ); #endif }
void setupSignals() { assert( signal(SIGSEGV, abruptQuit) != SIG_ERR ); assert( signal(SIGFPE, abruptQuit) != SIG_ERR ); assert( signal(SIGABRT, abruptQuit) != SIG_ERR ); assert( signal(SIGBUS, abruptQuit) != SIG_ERR ); assert( signal(SIGQUIT, abruptQuit) != SIG_ERR ); assert( signal(SIGPIPE, pipeSigHandler) != SIG_ERR ); setupSIGTRAPforGDB(); sigemptyset( &asyncSignals ); sigaddset( &asyncSignals, SIGHUP ); sigaddset( &asyncSignals, SIGINT ); sigaddset( &asyncSignals, SIGTERM ); assert( pthread_sigmask( SIG_SETMASK, &asyncSignals, 0 ) == 0 ); boost::thread it( interruptThread ); set_terminate( myterminate ); }
void init(){ serverID.init(); setupSIGTRAPforGDB(); setupCoreSignals(); setupSignals( false ); }
void setupSynchronousSignalHandlers() { std::set_terminate(myTerminate); std::set_new_handler(reportOutOfMemoryErrorAndExit); #if defined(_WIN32) invariant(signal(SIGABRT, abruptQuit) != SIG_ERR); _set_purecall_handler(myPureCallHandler); _set_invalid_parameter_handler(myInvalidParameterHandler); setWindowsUnhandledExceptionFilter(); #else { struct sigaction ignoredSignals; memset(&ignoredSignals, 0, sizeof(ignoredSignals)); ignoredSignals.sa_handler = SIG_IGN; sigemptyset(&ignoredSignals.sa_mask); invariant(sigaction(SIGHUP, &ignoredSignals, nullptr) == 0); invariant(sigaction(SIGUSR2, &ignoredSignals, nullptr) == 0); invariant(sigaction(SIGPIPE, &ignoredSignals, nullptr) == 0); } { struct sigaction plainSignals; memset(&plainSignals, 0, sizeof(plainSignals)); plainSignals.sa_handler = abruptQuit; sigemptyset(&plainSignals.sa_mask); // ^\ is the stronger ^C. Log and quit hard without waiting for cleanup. invariant(sigaction(SIGQUIT, &plainSignals, nullptr) == 0); #if __has_feature(address_sanitizer) // Sanitizers may be configured to call abort(). If so, we should omit our signal handler. bool shouldRegister = true; constexpr std::array<StringData, 5> sanitizerConfigVariable{"ASAN_OPTIONS"_sd, "TSAN_OPTIONS"_sd, "MSAN_OPTIONS"_sd, "UBSAN_OPTIONS"_sd, "LSAN_OPTIONS"_sd}; for (const StringData& option : sanitizerConfigVariable) { StringData configString(getenv(option.rawData())); if (configString.find("abort_on_error=1") != std::string::npos || configString.find("abort_on_error=true") != std::string::npos) { shouldRegister = false; } } if (shouldRegister) { invariant(sigaction(SIGABRT, &plainSignals, nullptr) == 0); } #else invariant(sigaction(SIGABRT, &plainSignals, nullptr) == 0); #endif } { struct sigaction addrSignals; memset(&addrSignals, 0, sizeof(addrSignals)); addrSignals.sa_sigaction = abruptQuitWithAddrSignal; sigemptyset(&addrSignals.sa_mask); addrSignals.sa_flags = SA_SIGINFO; invariant(sigaction(SIGSEGV, &addrSignals, nullptr) == 0); invariant(sigaction(SIGBUS, &addrSignals, nullptr) == 0); invariant(sigaction(SIGILL, &addrSignals, nullptr) == 0); invariant(sigaction(SIGFPE, &addrSignals, nullptr) == 0); } setupSIGTRAPforGDB(); #endif }
void init(){ serverID.init(); setupSIGTRAPforGDB(); signal(SIGTERM, sighandler); signal(SIGINT, sighandler); }
void init(){ serverID.init(); setupSIGTRAPforGDB(); }