Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 49c45aec authored by Colin Cross's avatar Colin Cross
Browse files

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
parent a5471a67
Loading
Loading
Loading
Loading
+25 −2
Original line number Diff line number Diff line
@@ -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) {