summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Colin Cross <ccross@android.com> 2016-10-03 13:40:32 -0700
committer Colin Cross <ccross@android.com> 2016-10-03 15:33:11 -0700
commit49c45aecc4e6074cbcef5e7a938ed0d06ba2737d (patch)
tree3292bd06780c67e10ae4c15b78b5a02acf15bf96
parenta5471a6723f4069f9c6e8d482d5a9045e58b695e (diff)
Propagate signals through makeparallel
Set up a signal handler in makeparallel that will forward SIGHUP, SIGINT, SIGQUIT, and SIGTERM to the child process. Bug: 31907490 Test: m -j & killall make; pgrep -a ninja Test: make makeparallel_test Change-Id: I306e5335ed1b2c7056804d5da377a2f283877f30
-rw-r--r--tools/makeparallel/makeparallel.cpp27
1 files changed, 25 insertions, 2 deletions
diff --git a/tools/makeparallel/makeparallel.cpp b/tools/makeparallel/makeparallel.cpp
index c70fa9a782..4ae8f61d9d 100644
--- a/tools/makeparallel/makeparallel.cpp
+++ b/tools/makeparallel/makeparallel.cpp
@@ -337,7 +337,29 @@ int main(int argc, char* argv[]) {
args.push_back(nullptr);
- pid_t pid = fork();
+ static pid_t pid;
+
+ // Set up signal handlers to forward SIGHUP, SIGINT, SIGQUIT, SIGTERM, and
+ // SIGALRM to child
+ struct sigaction action = {};
+ action.sa_flags = SA_SIGINFO | SA_RESTART,
+ action.sa_sigaction = [](int signal, siginfo_t*, void*) {
+ if (pid > 0) {
+ kill(pid, signal);
+ }
+ };
+
+ int ret = 0;
+ if (!ret) ret = sigaction(SIGHUP, &action, NULL);
+ if (!ret) ret = sigaction(SIGINT, &action, NULL);
+ if (!ret) ret = sigaction(SIGQUIT, &action, NULL);
+ if (!ret) ret = sigaction(SIGTERM, &action, NULL);
+ if (!ret) ret = sigaction(SIGALRM, &action, NULL);
+ if (ret < 0) {
+ error(errno, errno, "sigaction failed");
+ }
+
+ pid = fork();
if (pid < 0) {
error(errno, errno, "fork failed");
} else if (pid == 0) {
@@ -361,9 +383,10 @@ int main(int argc, char* argv[]) {
}
// parent
+
siginfo_t status = {};
int exit_status = 0;
- int ret = waitid(P_PID, pid, &status, WEXITED);
+ ret = waitid(P_PID, pid, &status, WEXITED);
if (ret < 0) {
error(errno, errno, "waitpid failed");
} else if (status.si_code == CLD_EXITED) {