From: Willy Tarreau Date: Sun, 10 May 2009 07:57:21 +0000 (+0200) Subject: [MEDIUM] pollers: don't wait if a signal is pending X-Git-Tag: v1.3.18~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=332740dab2396f2451faa67dd349eacee4136825;p=thirdparty%2Fhaproxy.git [MEDIUM] pollers: don't wait if a signal is pending If an asynchronous signal is received outside of the poller, we don't want the poller to wait for a timeout to occur before processing it, so we set its timeout to zero, just like we do with pending tasks in the run queue. --- diff --git a/src/ev_epoll.c b/src/ev_epoll.c index fdb31ec13e..345b0b2ac0 100644 --- a/src/ev_epoll.c +++ b/src/ev_epoll.c @@ -24,6 +24,7 @@ #include #include +#include #include #if defined(USE_MY_EPOLL) @@ -232,7 +233,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) fd_flush_changes(); /* now let's wait for events */ - if (run_queue) + if (run_queue || signal_queue_len) wait_time = 0; else if (!exp) wait_time = MAX_DELAY_MS; diff --git a/src/ev_kqueue.c b/src/ev_kqueue.c index f520106050..7e626d112d 100644 --- a/src/ev_kqueue.c +++ b/src/ev_kqueue.c @@ -30,6 +30,7 @@ #include #include +#include #include /* private data */ @@ -109,7 +110,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) timeout.tv_sec = 0; timeout.tv_nsec = 0; - if (!run_queue) { + if (!run_queue && !signal_queue_len) { if (!exp) { delta_ms = MAX_DELAY_MS; timeout.tv_sec = (MAX_DELAY_MS / 1000); diff --git a/src/ev_poll.c b/src/ev_poll.c index a86c599916..f5d011eea4 100644 --- a/src/ev_poll.c +++ b/src/ev_poll.c @@ -23,6 +23,7 @@ #include #include +#include #include @@ -124,7 +125,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) } /* now let's wait for events */ - if (run_queue) + if (run_queue || signal_queue_len) wait_time = 0; else if (!exp) wait_time = MAX_DELAY_MS; diff --git a/src/ev_select.c b/src/ev_select.c index 7fe7c23998..5a87282d29 100644 --- a/src/ev_select.c +++ b/src/ev_select.c @@ -22,6 +22,7 @@ #include #include +#include #include @@ -92,7 +93,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) delta.tv_sec = 0; delta.tv_usec = 0; - if (!run_queue) { + if (!run_queue && !signal_queue_len) { if (!exp) { delta_ms = MAX_DELAY_MS; delta.tv_sec = (MAX_DELAY_MS / 1000); diff --git a/src/ev_sepoll.c b/src/ev_sepoll.c index ee6284b07c..a093693f39 100644 --- a/src/ev_sepoll.c +++ b/src/ev_sepoll.c @@ -59,6 +59,7 @@ #include #include +#include #include #if defined(USE_MY_EPOLL) @@ -471,7 +472,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) } last_skipped = 0; - if (nbspec || status || run_queue) { + if (nbspec || status || run_queue || signal_queue_len) { /* Maybe we have processed some events that we must report, or * maybe we still have events in the spec list, or there are * some tasks left pending in the run_queue, so we must not