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;
/* 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
/* 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);
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();
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);