in io/epoll.cpp [227:263]
void wait_for_events(uint64_t timeout, const DataCB& datacb,
const FDCB& fdcb) {
if (!_events_remain) {
int ret = do_epoll_wait(timeout);
if (ret < 0) return;
}
while (_events_remain && fdcb()) {
auto& e = _events[--_events_remain];
if ((int)e.data.u64 == _evfd) {
uint64_t value;
eventfd_read(_evfd, &value);
continue;
}
assert(e.data.u64 < _inflight_events.size());
if (e.data.u64 >= _inflight_events.size()) continue;
auto& entry = _inflight_events[e.data.u64];
uint32_t events = 0;
if ((e.events & ERRBIT) && (entry.interests & EVENT_ERROR)) {
events |= EVENT_ERROR;
datacb(entry.error_data);
}
if ((e.events & READBITS) && (entry.interests & EVENT_READ)) {
events |= EVENT_READ;
datacb(entry.reader_data);
}
if ((e.events & WRITEBITS) && (entry.interests & EVENT_WRITE)) {
events |= EVENT_WRITE;
datacb(entry.writer_data);
}
if (events && (entry.interests & ONE_SHOT)) {
rm_interest({.fd = (int)e.data.u64,
.interests = events,
.data = nullptr});
}
}
}