Loop once after registering eventfd to prevent skipping previous events
This commit is contained in:
@@ -29,6 +29,7 @@ ring_loop_t::ring_loop_t(int qd, bool multithreaded)
|
|||||||
{
|
{
|
||||||
free_ring_data[i] = i;
|
free_ring_data[i] = i;
|
||||||
}
|
}
|
||||||
|
in_loop = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ring_loop_t::~ring_loop_t()
|
ring_loop_t::~ring_loop_t()
|
||||||
@@ -86,6 +87,11 @@ io_uring_sqe* ring_loop_t::get_sqe()
|
|||||||
|
|
||||||
void ring_loop_t::loop()
|
void ring_loop_t::loop()
|
||||||
{
|
{
|
||||||
|
if (in_loop)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
in_loop = true;
|
||||||
if (ring_eventfd >= 0)
|
if (ring_eventfd >= 0)
|
||||||
{
|
{
|
||||||
// Reset eventfd counter
|
// Reset eventfd counter
|
||||||
@@ -140,6 +146,7 @@ void ring_loop_t::loop()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while (loop_again);
|
} while (loop_again);
|
||||||
|
in_loop = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned ring_loop_t::save()
|
unsigned ring_loop_t::save()
|
||||||
@@ -189,5 +196,7 @@ int ring_loop_t::register_eventfd()
|
|||||||
ring_eventfd = -1;
|
ring_eventfd = -1;
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
// Loop once to prevent skipping events happened before eventfd was registered
|
||||||
|
loop();
|
||||||
return ring_eventfd;
|
return ring_eventfd;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -129,6 +129,7 @@ class ring_loop_t
|
|||||||
bool mt;
|
bool mt;
|
||||||
int *free_ring_data;
|
int *free_ring_data;
|
||||||
unsigned free_ring_data_ptr;
|
unsigned free_ring_data_ptr;
|
||||||
|
bool in_loop;
|
||||||
bool loop_again;
|
bool loop_again;
|
||||||
struct io_uring ring;
|
struct io_uring ring;
|
||||||
int ring_eventfd = -1;
|
int ring_eventfd = -1;
|
||||||
|
|||||||
Reference in New Issue
Block a user