in io/iouring-wrapper.cpp [330:374]
ssize_t wait_for_events(void** data, size_t count, Timeout timeout) override {
// Use master engine to wait for self event fd
int ret = ::photon::wait_for_fd_readable(m_eventfd, timeout);
if (ret < 0) {
return errno == ETIMEDOUT ? 0 : -1;
}
uint64_t value;
eventfd_read(m_eventfd, &value);
// Reap events
size_t num = 0;
io_uring_cqe* cqe = nullptr;
uint32_t head = 0;
unsigned i = 0;
io_uring_for_each_cqe(m_ring, head, cqe) {
++i;
auto ctx = (ioCtx*) io_uring_cqe_get_data(cqe);
if (!ctx) {
// rm_interest didn't set user data
continue;
}
ctx->res = cqe->res;
if (cqe->flags & IORING_CQE_F_MORE && cqe->res & POLLERR) {
LOG_ERROR_RETURN(0, -1, "iouring: multi-shot poll got POLLERR");
}
if (!ctx->is_event) {
LOG_ERROR_RETURN(0, -1, "iouring: cascading engine only needs to handle event. Must be a bug...")
}
eventCtx* event_ctx = container_of(ctx, eventCtx, io_ctx);
fdInterest fd_interest{event_ctx->event.fd, (uint32_t)evmap.translate_bitwisely(event_ctx->event.interests)};
if (ctx->res == -ECANCELED) {
m_event_contexts.erase(fd_interest);
} else if (event_ctx->one_shot) {
data[num++] = event_ctx->event.data;
m_event_contexts.erase(fd_interest);
} else {
data[num++] = event_ctx->event.data;
}
if (num >= count) {
break;
}
}
io_uring_cq_advance(m_ring, i);
return num;
}