From 8129a0b4e3bfe81d287906c872ef5391f0df7f6d Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Mon, 3 Mar 2025 00:57:00 +0300 Subject: [PATCH] Loop once after registering eventfd to prevent skipping previous events --- src/util/ringloop.cpp | 9 +++++++++ src/util/ringloop.h | 1 + 2 files changed, 10 insertions(+) diff --git a/src/util/ringloop.cpp b/src/util/ringloop.cpp index 3c4ad52b..c447b289 100644 --- a/src/util/ringloop.cpp +++ b/src/util/ringloop.cpp @@ -29,6 +29,7 @@ ring_loop_t::ring_loop_t(int qd, bool multithreaded) { free_ring_data[i] = i; } + in_loop = false; } ring_loop_t::~ring_loop_t() @@ -86,6 +87,11 @@ io_uring_sqe* ring_loop_t::get_sqe() void ring_loop_t::loop() { + if (in_loop) + { + return; + } + in_loop = true; if (ring_eventfd >= 0) { // Reset eventfd counter @@ -140,6 +146,7 @@ void ring_loop_t::loop() } } } while (loop_again); + in_loop = false; } unsigned ring_loop_t::save() @@ -189,5 +196,7 @@ int ring_loop_t::register_eventfd() ring_eventfd = -1; return r; } + // Loop once to prevent skipping events happened before eventfd was registered + loop(); return ring_eventfd; } diff --git a/src/util/ringloop.h b/src/util/ringloop.h index e1945526..b9fa9100 100644 --- a/src/util/ringloop.h +++ b/src/util/ringloop.h @@ -129,6 +129,7 @@ class ring_loop_t bool mt; int *free_ring_data; unsigned free_ring_data_ptr; + bool in_loop; bool loop_again; struct io_uring ring; int ring_eventfd = -1;