From: Timo Sirainen Date: Mon, 22 Mar 2021 14:59:09 +0000 (+0200) Subject: lib: Add io_loop_is_empty() X-Git-Tag: 2.3.16~216 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4c40609b561102ff04e5261579afbd6f095446f8;p=thirdparty%2Fdovecot%2Fcore.git lib: Add io_loop_is_empty() --- diff --git a/src/lib/ioloop.c b/src/lib/ioloop.c index 0628e0e0ef..6f10d11f27 100644 --- a/src/lib/ioloop.c +++ b/src/lib/ioloop.c @@ -1229,6 +1229,13 @@ bool io_loop_have_immediate_timeouts(struct ioloop *ioloop) return io_loop_get_wait_time(ioloop, &tv) == 0; } +bool io_loop_is_empty(struct ioloop *ioloop) +{ + return ioloop->io_files == NULL && + priorityq_count(ioloop->timeouts) == 0 && + array_count(&ioloop->timeouts_new) == 0; +} + uint64_t io_loop_get_wait_usecs(struct ioloop *ioloop) { return ioloop->ioloop_wait_usecs; diff --git a/src/lib/ioloop.h b/src/lib/ioloop.h index 75c6ef9f87..32e2892708 100644 --- a/src/lib/ioloop.h +++ b/src/lib/ioloop.h @@ -312,6 +312,8 @@ bool io_loop_have_ios(struct ioloop *ioloop); /* Returns TRUE if there is a pending timeout that is going to be run immediately. */ bool io_loop_have_immediate_timeouts(struct ioloop *ioloop); +/* Returns TRUE if there are no IOs or timeouts in the ioloop. */ +bool io_loop_is_empty(struct ioloop *ioloop); /* Returns number of microseconds spent on the ioloop waiting itself. */ uint64_t io_loop_get_wait_usecs(struct ioloop *ioloop); /* Return all io conditions added for the given fd. This needs to scan through diff --git a/src/lib/test-ioloop.c b/src/lib/test-ioloop.c index 91f38e0ea2..393291f60d 100644 --- a/src/lib/test-ioloop.c +++ b/src/lib/test-ioloop.c @@ -101,9 +101,15 @@ static void test_ioloop_timeout(void) /* add a timeout by moving it from another ioloop */ ioloop2 = io_loop_create(); + test_assert(io_loop_is_empty(ioloop)); + test_assert(io_loop_is_empty(ioloop2)); to2 = timeout_add(1000, timeout_callback, &tv_callback); + test_assert(io_loop_is_empty(ioloop)); + test_assert(!io_loop_is_empty(ioloop2)); io_loop_set_current(ioloop); to2 = io_loop_move_timeout(&to2); + test_assert(!io_loop_is_empty(ioloop)); + test_assert(io_loop_is_empty(ioloop2)); io_loop_set_current(ioloop2); io_loop_destroy(&ioloop2); @@ -120,6 +126,7 @@ static void test_ioloop_timeout(void) test_assert(timeval_diff_msecs(&tv_callback, &tv_start) >= 500); timeout_remove(&to); timeout_remove(&to2); + test_assert(io_loop_is_empty(ioloop)); io_loop_destroy(&ioloop); test_end(); @@ -276,7 +283,9 @@ static void test_ioloop_pending_io(void) struct istream *is = i_stream_create_from_data("data", 4); struct ioloop *ioloop = io_loop_create(); + test_assert(io_loop_is_empty(ioloop)); struct io *io = io_add_istream(is, io_callback_pending_io, NULL); + test_assert(!io_loop_is_empty(ioloop)); io_loop_set_current(ioloop); io_set_pending(io); io_loop_run(ioloop);