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);
}
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)
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);