void wait_for_events()

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});
            }
        }
    }