Loading ndb/src/kernel/main.cpp +76 −57 Original line number Diff line number Diff line Loading @@ -41,7 +41,9 @@ extern EventLogger g_eventLogger; void catchsigs(bool ignore); // for process signal handling extern "C" void handler(int signo); // for process signal handling extern "C" void handler_shutdown(int signum); // for process signal handling extern "C" void handler_error(int signum); // for process signal handling // Shows system information void systemInfo(const Configuration & conf, Loading Loading @@ -248,73 +250,90 @@ systemInfo(const Configuration & config, const LogLevel & logLevel){ } static void handler_register(int signum, sighandler_t handler, bool ignore) { if (ignore) { if(signum != SIGCHLD) signal(signum, SIG_IGN); } else signal(signum, handler); } void catchsigs(bool ignore){ #if ! defined NDB_SOFTOSE && !defined NDB_OSE #if defined SIGRTMIN #define MAX_SIG_CATCH SIGRTMIN #elif defined NSIG #define MAX_SIG_CATCH NSIG #else #error "neither SIGRTMIN or NSIG is defined on this platform, please report bug at bugs.mysql.com" static const int signals_shutdown[] = { #ifdef SIGBREAK SIGBREAK, #endif // Makes the main process catch process signals, eg installs a // handler named "handler". "handler" will then be called is instead // of the defualt process signal handler) if(ignore){ for(int i = 1; i < MAX_SIG_CATCH; i++){ if(i != SIGCHLD) signal(i, SIG_IGN); } } else { for(int i = 1; i < MAX_SIG_CATCH; i++){ signal(i, handler); } } SIGHUP, SIGINT, #if defined SIGPWR SIGPWR, #elif defined SIGINFO SIGINFO, #endif SIGQUIT, SIGTERM, #ifdef SIGTSTP SIGTSTP, #endif SIGTTIN, SIGTTOU }; static const int signals_error[] = { SIGABRT, SIGALRM, #ifdef SIGBUS SIGBUS, #endif SIGCHLD, SIGFPE, SIGILL, #ifdef SIGIO SIGIO, #endif #ifdef SIGPOLL SIGPOLL, #endif SIGSEGV, #ifdef SIGTRAP SIGTRAP #endif }; #endif static const int signals_ignore[] = { SIGPIPE }; for(size_t i = 0; i < sizeof(signals_shutdown)/sizeof(signals_shutdown[0]); i++) handler_register(signals_shutdown[i], handler_shutdown, ignore); for(size_t i = 0; i < sizeof(signals_error)/sizeof(signals_error[0]); i++) handler_register(signals_error[i], handler_error, ignore); for(size_t i = 0; i < sizeof(signals_ignore)/sizeof(signals_ignore[0]); i++) handler_register(signals_ignore[i], SIG_IGN, ignore); } extern "C" void handler(int sig){ switch(sig){ case SIGHUP: /* 1 - Hang up */ case SIGINT: /* 2 - Interrupt */ case SIGQUIT: /* 3 - Quit */ case SIGTERM: /* 15 - Terminate */ #ifdef SIGPWR case SIGPWR: /* 19 - Power fail */ #endif #ifdef SIGPOLL case SIGPOLL: /* 22 */ #endif case SIGSTOP: /* 23 */ case SIGTSTP: /* 24 */ case SIGTTIN: /* 26 */ case SIGTTOU: /* 27 */ handler_shutdown(int signum){ g_eventLogger.info("Received signal %d. Performing stop.", signum); globalData.theRestartFlag = perform_stop; break; #ifdef SIGWINCH case SIGWINCH: #endif case SIGPIPE: /** * Can happen in TCP Transporter * * Just ignore */ break; default: } extern "C" void handler_error(int signum){ g_eventLogger.info("Received signal %d. Running error handler.", signum); // restart the system char errorData[40]; snprintf(errorData, 40, "Signal %d received", sig); snprintf(errorData, 40, "Signal %d received", signum); ERROR_SET(fatal, 0, errorData, __FILE__); break; } } Loading Loading
ndb/src/kernel/main.cpp +76 −57 Original line number Diff line number Diff line Loading @@ -41,7 +41,9 @@ extern EventLogger g_eventLogger; void catchsigs(bool ignore); // for process signal handling extern "C" void handler(int signo); // for process signal handling extern "C" void handler_shutdown(int signum); // for process signal handling extern "C" void handler_error(int signum); // for process signal handling // Shows system information void systemInfo(const Configuration & conf, Loading Loading @@ -248,73 +250,90 @@ systemInfo(const Configuration & config, const LogLevel & logLevel){ } static void handler_register(int signum, sighandler_t handler, bool ignore) { if (ignore) { if(signum != SIGCHLD) signal(signum, SIG_IGN); } else signal(signum, handler); } void catchsigs(bool ignore){ #if ! defined NDB_SOFTOSE && !defined NDB_OSE #if defined SIGRTMIN #define MAX_SIG_CATCH SIGRTMIN #elif defined NSIG #define MAX_SIG_CATCH NSIG #else #error "neither SIGRTMIN or NSIG is defined on this platform, please report bug at bugs.mysql.com" static const int signals_shutdown[] = { #ifdef SIGBREAK SIGBREAK, #endif // Makes the main process catch process signals, eg installs a // handler named "handler". "handler" will then be called is instead // of the defualt process signal handler) if(ignore){ for(int i = 1; i < MAX_SIG_CATCH; i++){ if(i != SIGCHLD) signal(i, SIG_IGN); } } else { for(int i = 1; i < MAX_SIG_CATCH; i++){ signal(i, handler); } } SIGHUP, SIGINT, #if defined SIGPWR SIGPWR, #elif defined SIGINFO SIGINFO, #endif SIGQUIT, SIGTERM, #ifdef SIGTSTP SIGTSTP, #endif SIGTTIN, SIGTTOU }; static const int signals_error[] = { SIGABRT, SIGALRM, #ifdef SIGBUS SIGBUS, #endif SIGCHLD, SIGFPE, SIGILL, #ifdef SIGIO SIGIO, #endif #ifdef SIGPOLL SIGPOLL, #endif SIGSEGV, #ifdef SIGTRAP SIGTRAP #endif }; #endif static const int signals_ignore[] = { SIGPIPE }; for(size_t i = 0; i < sizeof(signals_shutdown)/sizeof(signals_shutdown[0]); i++) handler_register(signals_shutdown[i], handler_shutdown, ignore); for(size_t i = 0; i < sizeof(signals_error)/sizeof(signals_error[0]); i++) handler_register(signals_error[i], handler_error, ignore); for(size_t i = 0; i < sizeof(signals_ignore)/sizeof(signals_ignore[0]); i++) handler_register(signals_ignore[i], SIG_IGN, ignore); } extern "C" void handler(int sig){ switch(sig){ case SIGHUP: /* 1 - Hang up */ case SIGINT: /* 2 - Interrupt */ case SIGQUIT: /* 3 - Quit */ case SIGTERM: /* 15 - Terminate */ #ifdef SIGPWR case SIGPWR: /* 19 - Power fail */ #endif #ifdef SIGPOLL case SIGPOLL: /* 22 */ #endif case SIGSTOP: /* 23 */ case SIGTSTP: /* 24 */ case SIGTTIN: /* 26 */ case SIGTTOU: /* 27 */ handler_shutdown(int signum){ g_eventLogger.info("Received signal %d. Performing stop.", signum); globalData.theRestartFlag = perform_stop; break; #ifdef SIGWINCH case SIGWINCH: #endif case SIGPIPE: /** * Can happen in TCP Transporter * * Just ignore */ break; default: } extern "C" void handler_error(int signum){ g_eventLogger.info("Received signal %d. Running error handler.", signum); // restart the system char errorData[40]; snprintf(errorData, 40, "Signal %d received", sig); snprintf(errorData, 40, "Signal %d received", signum); ERROR_SET(fatal, 0, errorData, __FILE__); break; } } Loading