in folly/experimental/io/IoUringBackend.cpp [840:919]
int IoUringBackend::eb_event_base_loop(int flags) {
if (registerDefaultFds_) {
registerDefaultFds_ = false;
if (!addTimerFd() || !addSignalFds()) {
cleanup();
throw NotAvailable("io_uring_submit error");
}
}
// schedule the timers
bool done = false;
auto waitForEvents = (flags & EVLOOP_NONBLOCK) ? WaitForEventsMode::DONT_WAIT
: WaitForEventsMode::WAIT;
while (!done) {
scheduleTimeout();
// check if we need to break here
if (loopBreak_) {
loopBreak_ = false;
break;
}
submitList(submitList_, waitForEvents);
if (!numInsertedEvents_ && timers_.empty() && signals_.empty()) {
return 1;
}
uint64_t call_time = 0;
if (eb_poll_loop_pre_hook) {
eb_poll_loop_pre_hook(&call_time);
}
// do not wait for events if EVLOOP_NONBLOCK is set
int ret = getActiveEvents(waitForEvents);
if (eb_poll_loop_post_hook) {
eb_poll_loop_post_hook(call_time, ret);
}
size_t numProcessedTimers = 0;
// save the processTimers_
// this means we've received a notification
// and we need to add the timer fd back
bool processTimersFlag = processTimers_;
if (processTimers_ && !loopBreak_) {
numProcessedTimers = processTimers();
processTimers_ = false;
}
size_t numProcessedSignals = 0;
if (processSignals_ && !loopBreak_) {
numProcessedSignals = processSignals();
processSignals_ = false;
}
if (!activeEvents_.empty() && !loopBreak_) {
processActiveEvents();
if (flags & EVLOOP_ONCE) {
done = true;
}
} else if (flags & EVLOOP_NONBLOCK) {
if (signals_.empty()) {
done = true;
}
}
if (!done && (numProcessedTimers || numProcessedSignals) &&
(flags & EVLOOP_ONCE)) {
done = true;
}
if (processTimersFlag) {
addTimerFd();
}
}
return 0;
}