Browse Source

Simplify signal handler

Try to use signal-safe functions as much as possible
Closes #3995
Define sys_signame[] ourselves on linux
adaptive-webui-19844
Chocobo1 9 years ago
parent
commit
5c8a4b3912
  1. 88
      src/app/main.cpp

88
src/app/main.cpp

@ -79,10 +79,15 @@ Q_IMPORT_PLUGIN(qico)
// Signal handlers // Signal handlers
#if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN) #if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN)
void sigintHandler(int); void sigNormalHandler(int signum);
void sigtermHandler(int); void sigAbnormalHandler(int signum);
void sigsegvHandler(int); // sys_signame[] is only defined in BSD
void sigabrtHandler(int); const char *sysSigName[] = {
"", "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP", "SIGABRT", "SIGBUS", "SIGFPE", "SIGKILL",
"SIGUSR1", "SIGSEGV", "SIGUSR2", "SIGPIPE", "SIGALRM", "SIGTERM", "SIGSTKFLT", "SIGCHLD", "SIGCONT", "SIGSTOP",
"SIGTSTP", "SIGTTIN", "SIGTTOU", "SIGURG", "SIGXCPU", "SIGXFSZ", "SIGVTALRM", "SIGPROF", "SIGWINCH", "SIGIO",
"SIGPWR", "SIGUNUSED"
};
#endif #endif
struct QBtCommandLineParameters struct QBtCommandLineParameters
@ -240,10 +245,10 @@ int main(int argc, char *argv[])
#endif #endif
#if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN) #if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN)
signal(SIGABRT, sigabrtHandler); signal(SIGINT, sigNormalHandler);
signal(SIGTERM, sigtermHandler); signal(SIGTERM, sigNormalHandler);
signal(SIGINT, sigintHandler); signal(SIGABRT, sigAbnormalHandler);
signal(SIGSEGV, sigsegvHandler); signal(SIGSEGV, sigAbnormalHandler);
#endif #endif
return app->exec(params.torrents); return app->exec(params.torrents);
@ -303,58 +308,41 @@ QBtCommandLineParameters parseCommandLine()
} }
#if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN) #if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN)
void sigintHandler(int) void sigNormalHandler(int signum)
{ {
signal(SIGINT, 0);
qDebug("Catching SIGINT, exiting cleanly");
qApp->exit();
}
void sigtermHandler(int)
{
signal(SIGTERM, 0);
qDebug("Catching SIGTERM, exiting cleanly");
qApp->exit();
}
void sigsegvHandler(int)
{
signal(SIGABRT, 0);
signal(SIGSEGV, 0);
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU #if !defined Q_OS_WIN && !defined Q_OS_HAIKU
std::cerr << "\n\n*************************************************************\n"; const char str1[] = "Catching signal: ";
std::cerr << "Catching SIGSEGV, please report a bug at http://bug.qbittorrent.org\nand provide the following backtrace:\n"; const char *sigName = sysSigName[signum];
std::cerr << "qBittorrent version: " << VERSION << std::endl; const char str2[] = "\nExiting cleanly\n";
print_stacktrace(); write(STDERR_FILENO, str1, strlen(str1));
#else write(STDERR_FILENO, sigName, strlen(sigName));
#ifdef STACKTRACE_WIN write(STDERR_FILENO, str2, strlen(str2));
StraceDlg dlg; #endif // !defined Q_OS_WIN && !defined Q_OS_HAIKU
dlg.setStacktraceString(straceWin::getBacktrace()); signal(signum, SIG_DFL);
dlg.exec(); qApp->exit(); // unsafe, but exit anyway
#endif
#endif
raise(SIGSEGV);
} }
void sigabrtHandler(int) void sigAbnormalHandler(int signum)
{ {
signal(SIGABRT, 0);
signal(SIGSEGV, 0);
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU #if !defined Q_OS_WIN && !defined Q_OS_HAIKU
std::cerr << "\n\n*************************************************************\n"; const char str1[] = "\n\n*************************************************************\nCatching signal: ";
std::cerr << "Catching SIGABRT, please report a bug at http://bug.qbittorrent.org\nand provide the following backtrace:\n"; const char *sigName = sysSigName[signum];
std::cerr << "qBittorrent version: " << VERSION << std::endl; const char str2[] = "\nPlease file a bug report at http://bug.qbittorrent.org and provide the following information:\n\n"
print_stacktrace(); "qBittorrent version: " VERSION "\n";
#else write(STDERR_FILENO, str1, strlen(str1));
write(STDERR_FILENO, sigName, strlen(sigName));
write(STDERR_FILENO, str2, strlen(str2));
print_stacktrace(); // unsafe
#endif // !defined Q_OS_WIN && !defined Q_OS_HAIKU
#ifdef STACKTRACE_WIN #ifdef STACKTRACE_WIN
StraceDlg dlg; StraceDlg dlg; // unsafe
dlg.setStacktraceString(straceWin::getBacktrace()); dlg.setStacktraceString(straceWin::getBacktrace());
dlg.exec(); dlg.exec();
#endif #endif // STACKTRACE_WIN
#endif signal(signum, SIG_DFL);
raise(SIGABRT); raise(signum);
} }
#endif #endif // defined(Q_OS_UNIX) || defined(STACKTRACE_WIN)
#ifndef DISABLE_GUI #ifndef DISABLE_GUI
void showSplashScreen() void showSplashScreen()

Loading…
Cancel
Save