From 78f8dcb7f07903e22c5452295fe3cf8dd7ae0ea6 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Tue, 21 Jun 2016 17:34:14 +0200 Subject: [PATCH] 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. --- src/checks.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/checks.c b/src/checks.c index b925d0561..51864e389 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);