]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Add io_loop_stop_delayed()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 29 Oct 2019 16:47:51 +0000 (18:47 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Thu, 7 Nov 2019 11:26:41 +0000 (11:26 +0000)
src/lib/ioloop-private.h
src/lib/ioloop.c
src/lib/ioloop.h

index b5debb352342913e129a4f5a7458f636d01668b0..abf2a44a3faf2ceb7445036a59268645921b589f 100644 (file)
@@ -33,6 +33,7 @@ struct ioloop {
 
        bool running:1;
        bool iolooping:1;
+       bool stop_after_run_loop:1;
 };
 
 struct io {
index 7482970aa9c88192e8a6acf65b2c9eefcc819320..f72690d9e2607cb01a0acb681c0ec632142b3bba 100644 (file)
@@ -769,6 +769,8 @@ void io_loop_handler_run(struct ioloop *ioloop)
        ioloop->wait_started = ioloop_timeval;
        io_loop_handler_run_internal(ioloop);
        io_loop_call_pending(ioloop);
+       if (ioloop->stop_after_run_loop)
+               io_loop_stop(ioloop);
 
        i_assert(ioloop == current_ioloop);
 }
@@ -776,6 +778,12 @@ void io_loop_handler_run(struct ioloop *ioloop)
 void io_loop_stop(struct ioloop *ioloop)
 {
         ioloop->running = FALSE;
+       ioloop->stop_after_run_loop = FALSE;
+}
+
+void io_loop_stop_delayed(struct ioloop *ioloop)
+{
+        ioloop->stop_after_run_loop = TRUE;
 }
 
 void io_loop_set_running(struct ioloop *ioloop)
index c1f9aa4853095d64cbccb2e71f995e3f8851612e..c51296512f9af08c39ad1db370cc46c76f4651b8 100644 (file)
@@ -181,7 +181,11 @@ void timeout_reset(struct timeout *timeout);
 void io_loop_time_refresh(void);
 
 void io_loop_run(struct ioloop *ioloop);
-void io_loop_stop(struct ioloop *ioloop); /* safe to run in signal handler */
+/* Stop the ioloop immediately. No further IO or timeout callbacks are called.
+   This is safe to run in a signal handler. */
+void io_loop_stop(struct ioloop *ioloop);
+/* Stop ioloop after finishing all the pending IOs and timeouts. */
+void io_loop_stop_delayed(struct ioloop *ioloop);
 
 bool io_loop_is_running(struct ioloop *ioloop);