summaryrefslogtreecommitdiff
path: root/src/MultiUrlRequestInfo.cc
diff options
context:
space:
mode:
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>&