]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
master: Wait more precisely 5 secs at deinit for child processes to die.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 2 May 2017 12:56:40 +0000 (15:56 +0300)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Thu, 11 May 2017 13:13:02 +0000 (16:13 +0300)
Use milliseconds granularity instead of seconds.

src/master/service-monitor.c

index 92935d9d346619b54ed2c270835dac845435477e..761c6cbbeea44036e3ba28e3db63f79d9389c7bf 100644 (file)
@@ -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);
        }