From 808e1b7c40550510bb6c1be72e5bc99c019c336b Mon Sep 17 00:00:00 2001 From: William Lallemand Date: Sat, 15 Dec 2018 22:34:31 +0100 Subject: [PATCH] BUG/MEDIUM: threads: don't close the thread waker pipe if not init This bugfix concerns the thread deinit but affects the master process. When the master process falls in wait mode (it fails to reload the configuration), it launches the deinit_pollers_per_thread and close the thread waker pipe. It closes rd (-1) and wr (0). Closing a FD in the master can have several sides effects and the process will probably quit at some point. In this case it assigns 0 to the socketpair of a worker during the next correct reload, and then closes the socketpair once it falls in wait mode again. The worker assumes that the master died and leaves. --- src/fd.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/fd.c b/src/fd.c index a787a0957..84cb9080c 100644 --- a/src/fd.c +++ b/src/fd.c @@ -503,8 +503,15 @@ static void deinit_pollers_per_thread() { free(fd_updt); fd_updt = NULL; - close(poller_rd_pipe); - close(poller_wr_pipe[tid]); + + /* rd and wr are init at the same place, but only rd is init to -1, so + we rely to rd to close. */ + if (poller_rd_pipe > -1) { + close(poller_rd_pipe); + poller_rd_pipe = -1; + close(poller_wr_pipe[tid]); + poller_wr_pipe[tid] = -1; + } } /*