From: Willy Tarreau Date: Tue, 21 Jun 2016 15:34:14 +0000 (+0200) Subject: CLEANUP: external-check: don't block/unblock SIGCHLD when manipulating the list X-Git-Tag: v1.7-dev4~57 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=78f8dcb7f07903e22c5452295fe3cf8dd7ae0ea6;p=thirdparty%2Fhaproxy.git CLEANUP: external-check: don't block/unblock SIGCHLD when manipulating the list There's no point in blocking/unblocking sigchld when removing entries from the list since the code is called asynchronously. Similarly the blocking/unblocking could be removed from the connect_proc_chk() function but it happens that at high signal rates, fork() takes twice as much time to execute as it is regularly interrupted by a signal, so in the end this signal blocking is beneficial there for performance reasons. --- diff --git a/src/checks.c b/src/checks.c index b925d05613..51864e3891 100644 --- a/src/checks.c +++ b/src/checks.c @@ -1552,7 +1552,6 @@ void unblock_sigchld(void) assert(sigprocmask(SIG_UNBLOCK, &set, NULL) == 0); } -/* Call with SIGCHLD blocked */ static struct pid_list *pid_list_add(pid_t pid, struct task *t) { struct pid_list *elem; @@ -1570,7 +1569,6 @@ static struct pid_list *pid_list_add(pid_t pid, struct task *t) return elem; } -/* Blocks blocks and then unblocks SIGCHLD */ static void pid_list_del(struct pid_list *elem) { struct check *check; @@ -1578,9 +1576,7 @@ static void pid_list_del(struct pid_list *elem) if (!elem) return; - block_sigchld(); LIST_DEL(&elem->list); - unblock_sigchld(); if (!elem->exited) kill(elem->pid, SIGTERM);