From: Timo Sirainen Date: Tue, 29 Oct 2019 16:47:51 +0000 (+0200) Subject: lib: Add io_loop_stop_delayed() X-Git-Tag: 2.3.9~57 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0b40e87e01cf0115dd9c91409c4a527b63b4d7c0;p=thirdparty%2Fdovecot%2Fcore.git lib: Add io_loop_stop_delayed() --- diff --git a/src/lib/ioloop-private.h b/src/lib/ioloop-private.h index b5debb3523..abf2a44a3f 100644 --- a/src/lib/ioloop-private.h +++ b/src/lib/ioloop-private.h @@ -33,6 +33,7 @@ struct ioloop { bool running:1; bool iolooping:1; + bool stop_after_run_loop:1; }; struct io { diff --git a/src/lib/ioloop.c b/src/lib/ioloop.c index 7482970aa9..f72690d9e2 100644 --- a/src/lib/ioloop.c +++ b/src/lib/ioloop.c @@ -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) diff --git a/src/lib/ioloop.h b/src/lib/ioloop.h index c1f9aa4853..c51296512f 100644 --- a/src/lib/ioloop.h +++ b/src/lib/ioloop.h @@ -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);