From 0b40e87e01cf0115dd9c91409c4a527b63b4d7c0 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Tue, 29 Oct 2019 18:47:51 +0200 Subject: [PATCH] lib: Add io_loop_stop_delayed() --- src/lib/ioloop-private.h | 1 + src/lib/ioloop.c | 8 ++++++++ src/lib/ioloop.h | 6 +++++- 3 files changed, 14 insertions(+), 1 deletion(-) 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); -- 2.47.3