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.
This commit is contained in:
Willy Tarreau 2016-06-21 17:34:14 +02:00
parent ebc9244059
commit 78f8dcb7f0

View File

@ -1552,7 +1552,6 @@ void unblock_sigchld(void)
assert(sigprocmask(SIG_UNBLOCK, &set, NULL) == 0); assert(sigprocmask(SIG_UNBLOCK, &set, NULL) == 0);
} }
/* Call with SIGCHLD blocked */
static struct pid_list *pid_list_add(pid_t pid, struct task *t) static struct pid_list *pid_list_add(pid_t pid, struct task *t)
{ {
struct pid_list *elem; struct pid_list *elem;
@ -1570,7 +1569,6 @@ static struct pid_list *pid_list_add(pid_t pid, struct task *t)
return elem; return elem;
} }
/* Blocks blocks and then unblocks SIGCHLD */
static void pid_list_del(struct pid_list *elem) static void pid_list_del(struct pid_list *elem)
{ {
struct check *check; struct check *check;
@ -1578,9 +1576,7 @@ static void pid_list_del(struct pid_list *elem)
if (!elem) if (!elem)
return; return;
block_sigchld();
LIST_DEL(&elem->list); LIST_DEL(&elem->list);
unblock_sigchld();
if (!elem->exited) if (!elem->exited)
kill(elem->pid, SIGTERM); kill(elem->pid, SIGTERM);