summaryrefslogtreecommitdiff
path: root/src/MultiUrlRequestInfo.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2013-05-04 23:56:19 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2013-05-04 23:56:19 +0900
commitebfc5f55e50972520ead1fda7cabcdc494c61e3f (patch)
tree28f38146a71ace546d67ac3742b9e91855aed515 /src/MultiUrlRequestInfo.cc
parent7d55341fded7b88f528b62a5527f9df8bc3259d8 (diff)
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.
Diffstat (limited to 'src/MultiUrlRequestInfo.cc')
-rw-r--r--src/MultiUrlRequestInfo.cc69
1 files changed, 49 insertions, 20 deletions
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<Notifier>::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<DownloadEngine>&