897b281e67dc82700db9fd9c2dedc5e01e5871ee — Florent Le Coz 7 years ago 54f96de
Avoid some potential race conditions by blocking the signals we manage

They are atomically unblocked in the ppoll/epoll_pwait calls, avoiding any
race condition on the check of the “stop” or “reload” booleans.
2 files changed, 12 insertions(+), 2 deletions(-)

M louloulibs
M src/main.cpp
M louloulibs => louloulibs +1 -1
@@ 1,1 1,1 @@
Subproject commit 89398b5d886744c3812b65195308cae57eca2b53
Subproject commit 0f3c1183e2bf0941ae2bffd3f31577bce4f3001c

M src/main.cpp => src/main.cpp +11 -1
@@ 99,9 99,19 @@ int main(int ac, char** av)
  if (hostname.empty())
    return config_help("hostname");

  // Block the signals we want to manage. They will be unblocked only during
  // the epoll_pwait or ppoll calls. This avoids some race conditions,
  // explained in man 2 pselect on linux
  sigset_t mask;
  sigaddset(&mask, SIGINT);
  sigaddset(&mask, SIGTERM);
  sigaddset(&mask, SIGUSR1);
  sigaddset(&mask, SIGUSR2);
  sigprocmask(SIG_BLOCK, &mask, nullptr);

  // Install the signals used to exit the process cleanly, or reload the
  // config
  sigset_t mask;
  struct sigaction on_sigint;
  on_sigint.sa_sigaction = &sigint_handler;