Commit 9cf1542e authored by unknown's avatar unknown

changed signal handler registration to fix some platform specific problems

parent b368cb3f
...@@ -41,7 +41,9 @@ ...@@ -41,7 +41,9 @@
extern EventLogger g_eventLogger; extern EventLogger g_eventLogger;
void catchsigs(bool ignore); // for process signal handling 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 // Shows system information
void systemInfo(const Configuration & conf, void systemInfo(const Configuration & conf,
...@@ -248,71 +250,89 @@ systemInfo(const Configuration & config, const LogLevel & logLevel){ ...@@ -248,71 +250,89 @@ 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 void
catchsigs(bool ignore){ catchsigs(bool ignore){
#if ! defined NDB_SOFTOSE && !defined NDB_OSE #if ! defined NDB_SOFTOSE && !defined NDB_OSE
#if defined SIGRTMIN static const int signals_shutdown[] = {
#define MAX_SIG_CATCH SIGRTMIN #ifdef SIGBREAK
#elif defined NSIG SIGBREAK,
#define MAX_SIG_CATCH NSIG
#else
#error "neither SIGRTMIN or NSIG is defined on this platform, please report bug at bugs.mysql.com"
#endif #endif
SIGHUP,
// Makes the main process catch process signals, eg installs a SIGINT,
// handler named "handler". "handler" will then be called is instead #if defined SIGPWR
// of the defualt process signal handler) SIGPWR,
if(ignore){ #elif defined SIGINFO
for(int i = 1; i < MAX_SIG_CATCH; i++){ SIGINFO,
if(i != SIGCHLD) #endif
signal(i, SIG_IGN); SIGQUIT,
} SIGTERM,
} else { #ifdef SIGTSTP
for(int i = 1; i < MAX_SIG_CATCH; i++){ SIGTSTP,
signal(i, handler);
}
}
#endif #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" extern "C"
void void
handler(int sig){ handler_shutdown(int signum){
switch(sig){ g_eventLogger.info("Received signal %d. Performing stop.", signum);
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 */
globalData.theRestartFlag = perform_stop; globalData.theRestartFlag = perform_stop;
break; }
#ifdef SIGWINCH
case SIGWINCH: extern "C"
#endif void
case SIGPIPE: handler_error(int signum){
/** g_eventLogger.info("Received signal %d. Running error handler.", signum);
* Can happen in TCP Transporter
*
* Just ignore
*/
break;
default:
// restart the system // restart the system
char errorData[40]; char errorData[40];
snprintf(errorData, 40, "Signal %d received", sig); snprintf(errorData, 40, "Signal %d received", signum);
ERROR_SET(fatal, 0, errorData, __FILE__); ERROR_SET(fatal, 0, errorData, __FILE__);
break;
}
} }
...@@ -321,4 +341,3 @@ handler(int sig){ ...@@ -321,4 +341,3 @@ handler(int sig){
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment