]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Add io_loop_is_empty()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 22 Mar 2021 14:59:09 +0000 (16:59 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Thu, 6 May 2021 06:28:50 +0000 (06:28 +0000)
src/lib/ioloop.c
src/lib/ioloop.h
src/lib/test-ioloop.c

index 0628e0e0ef0b2f866168ae1497d929130b8e24af..6f10d11f273838ce89cfec3a45397b5083b19cf3 100644 (file)
@@ -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;
index 75c6ef9f8743b526d60bd1fcd1ec378f62648206..32e28927081ea9098a338a45b5d6c8775d7e89fc 100644 (file)
@@ -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
index 91f38e0ea27c6f860249d559fd7066a576ea7fa2..393291f60d0a235573cd409854661eccf88d28e0 100644 (file)
@@ -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);