static void *child_reaper(void *arg) { #ifndef _WIN32 sigset_t sigset; // By default, keep both SIGCHLD and SIGUSR1 blocked sigemptyset(&sigset); sigaddset(&sigset, SIGUSR1); sigaddset(&sigset, SIGCHLD); pthread_sigmask(SIG_BLOCK, &sigset, NULL); // SIGCHLD is ordinarily blocked, so we listen for it only in // sigsuspend, when we're also listening for the SIGUSR1 that tells // us to exit. pthread_sigmask(SIG_BLOCK, NULL, &sigset); sigdelset(&sigset, SIGCHLD); sigdelset(&sigset, SIGUSR1); #endif unused_parameter(arg); w_set_thread_name("child_reaper"); #ifdef _WIN32 while (!stopping) { usleep(200000); w_reap_children(true); } #else while (!stopping) { w_reap_children(false); sigsuspend(&sigset); } #endif return 0; }
static void *child_reaper(void *arg) { sigset_t sigset; unused_parameter(arg); // Unblock SIGCHLD only in this thread sigemptyset(&sigset); sigaddset(&sigset, SIGCHLD); pthread_sigmask(SIG_UNBLOCK, &sigset, NULL); while (!stopping) { usleep(200000); w_reap_children(true); } return 0; }