Proper shutdown on SIGINT/SIGTERM/SIGHUP

heavy-resources
Julius Michaelis 2014-04-01 18:03:01 +02:00
parent a06b7e3c23
commit 67a99a88d9
2 changed files with 44 additions and 31 deletions

View File

@ -127,39 +127,52 @@ int main()
static void crash_handler(int signo)
{
int logfd = STDERR_FILENO;
for (;;)
static unsigned signal_count = 0;
++signal_count;
switch (signo)
{
// Print out the signal
write(logfd, C4VERSION ": Caught signal ", sizeof (C4VERSION ": Caught signal ") - 1);
switch (signo)
case SIGINT: case SIGTERM: case SIGHUP:
if (signal_count < 2) {
Application.Quit();
// reinstall handler
signal(signo, crash_handler);
break;
} // else/fallthrough
default:
int logfd = STDERR_FILENO;
for (;;)
{
case SIGBUS: write(logfd, "SIGBUS", sizeof ("SIGBUS") - 1); break;
case SIGILL: write(logfd, "SIGILL", sizeof ("SIGILL") - 1); break;
case SIGSEGV: write(logfd, "SIGSEGV", sizeof ("SIGSEGV") - 1); break;
case SIGABRT: write(logfd, "SIGABRT", sizeof ("SIGABRT") - 1); break;
case SIGINT: write(logfd, "SIGINT", sizeof ("SIGINT") - 1); break;
case SIGQUIT: write(logfd, "SIGQUIT", sizeof ("SIGQUIT") - 1); break;
case SIGFPE: write(logfd, "SIGFPE", sizeof ("SIGFPE") - 1); break;
case SIGTERM: write(logfd, "SIGTERM", sizeof ("SIGTERM") - 1); break;
// Print out the signal
write(logfd, C4VERSION ": Caught signal ", sizeof (C4VERSION ": Caught signal ") - 1);
switch (signo)
{
case SIGBUS: write(logfd, "SIGBUS", sizeof ("SIGBUS") - 1); break;
case SIGILL: write(logfd, "SIGILL", sizeof ("SIGILL") - 1); break;
case SIGSEGV: write(logfd, "SIGSEGV", sizeof ("SIGSEGV") - 1); break;
case SIGABRT: write(logfd, "SIGABRT", sizeof ("SIGABRT") - 1); break;
case SIGINT: write(logfd, "SIGINT", sizeof ("SIGINT") - 1); break;
case SIGQUIT: write(logfd, "SIGQUIT", sizeof ("SIGQUIT") - 1); break;
case SIGFPE: write(logfd, "SIGFPE", sizeof ("SIGFPE") - 1); break;
case SIGTERM: write(logfd, "SIGTERM", sizeof ("SIGTERM") - 1); break;
}
write(logfd, "\n", sizeof ("\n") - 1);
if (logfd == STDERR_FILENO) logfd = GetLogFD();
else break;
if (logfd < 0) break;
}
write(logfd, "\n", sizeof ("\n") - 1);
if (logfd == STDERR_FILENO) logfd = GetLogFD();
else break;
if (logfd < 0) break;
}
#ifdef HAVE_EXECINFO_H
// Get the backtrace
void *stack[100];
int count = backtrace(stack, 100);
// Print it out
backtrace_symbols_fd (stack, count, STDERR_FILENO);
// Also to the log file
if (logfd >= 0)
backtrace_symbols_fd (stack, count, logfd);
// Get the backtrace
void *stack[100];
int count = backtrace(stack, 100);
// Print it out
backtrace_symbols_fd (stack, count, STDERR_FILENO);
// Also to the log file
if (logfd >= 0)
backtrace_symbols_fd (stack, count, logfd);
#endif
// Bye.
_exit(C4XRV_Failure);
// Bye.
_exit(C4XRV_Failure);
}
}
#endif // HAVE_SIGNAL_H

View File

@ -177,9 +177,9 @@ bool StdScheduler::DoScheduleProcs(int iTimeout)
}
}
}
else if (cnt < 0)
else if (cnt < 0 && errno != EINTR)
{
printf("StdScheduler::Execute: poll failed: %s\n",strerror(errno));
printf("StdScheduler::%s: poll failed: %s\n",__func__,strerror(errno));
}
return fSuccess;
}
@ -245,4 +245,4 @@ void *StdThread::_ThreadFunc(void *pPar)
return reinterpret_cast<void *>(pThread->ThreadFunc());
}
#endif
#endif