From ebfc5f55e50972520ead1fda7cabcdc494c61e3f Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 4 May 2013 23:56:19 +0900 Subject: Add SessionConfig to store per Session config sessionConfigSetKeepRunning() was removed and SessionConfig has keepRunning member instead. Signal handlers are now all prepared in MultiUrlRequestGroup object. Setting SessionConfig.useSignalHandler to false will avoid signal handler setup. --- src/MultiUrlRequestInfo.cc | 69 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 20 deletions(-) (limited to 'src/MultiUrlRequestInfo.cc') diff --git a/src/MultiUrlRequestInfo.cc b/src/MultiUrlRequestInfo.cc index 5746b748..7d16e33e 100644 --- a/src/MultiUrlRequestInfo.cc +++ b/src/MultiUrlRequestInfo.cc @@ -112,8 +112,9 @@ MultiUrlRequestInfo::MultiUrlRequestInfo : option_(op), statCalc_(statCalc), summaryOut_(summaryOut), - uriListParser_(uriListParser) + uriListParser_(uriListParser), // TODO init mask_ + useSignalHandler_(true) { requestGroups_.swap(requestGroups); } @@ -238,27 +239,15 @@ int MultiUrlRequestInfo::prepare() if(uriListParser_) { e_->getRequestGroupMan()->setUriListParser(uriListParser_); } -#ifdef HAVE_SIGACTION - sigemptyset(&mask_); - sigaddset(&mask_, SIGINT); - sigaddset(&mask_, SIGTERM); -#ifdef SIGHUP - sigaddset(&mask_, SIGHUP); -#endif // SIGHUP -#else // !HAVE_SIGACTION - mask_ = 0; -#endif // !HAVE_SIGACTION - -#ifdef SIGHUP - util::setGlobalSignalHandler(SIGHUP, &mask_, handler, 0); -#endif // SIGHUP - util::setGlobalSignalHandler(SIGINT, &mask_, handler, 0); - util::setGlobalSignalHandler(SIGTERM, &mask_, handler, 0); - + if(useSignalHandler_) { + setupSignalHandlers(); + } e_->getRequestGroupMan()->getNetStat().downloadStart(); } catch(RecoverableException& e) { SingletonHolder::clear(); - resetSignalHandlers(); + if(useSignalHandler_) { + resetSignalHandlers(); + } return -1; } return 0; @@ -319,10 +308,43 @@ error_code::Value MultiUrlRequestInfo::execute() A2_LOG_ERROR_EX(EX_EXCEPTION_CAUGHT, e); } error_code::Value returnValue = getResult(); - resetSignalHandlers(); + if(useSignalHandler_) { + resetSignalHandlers(); + } return returnValue; } +void MultiUrlRequestInfo::setupSignalHandlers() +{ +#ifdef HAVE_SIGACTION + sigemptyset(&mask_); +#else // !HAVE_SIGACTION + mask_ = 0; +#endif // !HAVE_SIGACTION +#ifdef SIGPIPE + util::setGlobalSignalHandler(SIGPIPE, &mask_, SIG_IGN, 0); +#endif // SIGPIPE +#ifdef SIGCHLD + // Avoid to create zombie process when forked child processes are + // died. + util::setGlobalSignalHandler(SIGCHLD, &mask_, SIG_IGN, 0); +#endif // SIGCHILD + +#ifdef HAVE_SIGACTION + sigaddset(&mask_, SIGINT); + sigaddset(&mask_, SIGTERM); +# ifdef SIGHUP + sigaddset(&mask_, SIGHUP); +# endif // SIGHUP +#endif // HAVE_SIGACTION + +#ifdef SIGHUP + util::setGlobalSignalHandler(SIGHUP, &mask_, handler, 0); +#endif // SIGHUP + util::setGlobalSignalHandler(SIGINT, &mask_, handler, 0); + util::setGlobalSignalHandler(SIGTERM, &mask_, handler, 0); +} + void MultiUrlRequestInfo::resetSignalHandlers() { #ifdef HAVE_SIGACTION @@ -333,6 +355,13 @@ void MultiUrlRequestInfo::resetSignalHandlers() #endif // SIGHUP util::setGlobalSignalHandler(SIGINT, &mask_, SIG_DFL, 0); util::setGlobalSignalHandler(SIGTERM, &mask_, SIG_DFL, 0); + +#ifdef SIGCHLD + util::setGlobalSignalHandler(SIGCHLD, &mask_, SIG_DFL, 0); +#endif // SIGCHILD +#ifdef SIGPIPE + util::setGlobalSignalHandler(SIGPIPE, &mask_, SIG_DFL, 0); +#endif // SIGPIPE } const SharedHandle& -- cgit