From: Timo Sirainen Date: Tue, 2 May 2017 12:56:40 +0000 (+0300) Subject: master: Wait more precisely 5 secs at deinit for child processes to die. X-Git-Tag: 2.3.0.rc1~1651 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6e5f8923e3353300e0922adf2c44bdef6e8e03f7;p=thirdparty%2Fdovecot%2Fcore.git master: Wait more precisely 5 secs at deinit for child processes to die. Use milliseconds granularity instead of seconds. --- diff --git a/src/master/service-monitor.c b/src/master/service-monitor.c index 92935d9d34..761c6cbbee 100644 --- a/src/master/service-monitor.c +++ b/src/master/service-monitor.c @@ -7,6 +7,7 @@ #include "hash.h" #include "str.h" #include "safe-mkstemp.h" +#include "time-util.h" #include "master-client.h" #include "service.h" #include "service-process.h" @@ -22,7 +23,7 @@ #define SERVICE_DROP_WARN_INTERVAL_SECS 60 #define SERVICE_DROP_TIMEOUT_MSECS (10*1000) -#define MAX_DIE_WAIT_SECS 5 +#define MAX_DIE_WAIT_MSECS 5000 #define SERVICE_MAX_EXIT_FAILURES_IN_SEC 10 #define SERVICE_PREFORK_MAX_AT_ONCE 10 @@ -573,9 +574,12 @@ void service_monitor_stop_close(struct service *service) static void services_monitor_wait(struct service_list *service_list) { struct service *const *servicep; - time_t max_wait_time = time(NULL) + MAX_DIE_WAIT_SECS; + struct timeval tv_start; bool finished; + io_loop_time_refresh(); + tv_start = ioloop_timeval; + for (;;) { finished = TRUE; services_monitor_reap_children(); @@ -585,7 +589,9 @@ static void services_monitor_wait(struct service_list *service_list) if ((*servicep)->process_avail > 0) finished = FALSE; } - if (finished || time(NULL) > max_wait_time) + io_loop_time_refresh(); + if (finished || + timeval_diff_msecs(&ioloop_timeval, &tv_start) > MAX_DIE_WAIT_MSECS) break; usleep(100000); }