diff options
| author | 2016-10-03 13:40:32 -0700 | |
|---|---|---|
| committer | 2016-10-03 15:33:11 -0700 | |
| commit | 49c45aecc4e6074cbcef5e7a938ed0d06ba2737d (patch) | |
| tree | 3292bd06780c67e10ae4c15b78b5a02acf15bf96 | |
| parent | a5471a6723f4069f9c6e8d482d5a9045e58b695e (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.cpp | 27 |
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) { |