virtual int rm_interest()

in io/epoll.cpp [172:199]


    virtual int rm_interest(Event e) override {
        if (e.fd < 0 || (size_t)e.fd >= _inflight_events.size())
            LOG_ERROR_RETURN(EINVAL, -1, "invalid file descriptor ", e.fd);
        if (unlikely(e.interests == 0)) return 0;
        auto& entry = _inflight_events[e.fd];
        auto eint = entry.interests & EVENT_RWEO;
        auto intersection = e.interests & eint;
        if (intersection == 0) return 0;

        auto remain = eint ^ intersection;  // ^ is to flip intersected bits
        if (likely(remain == ONE_SHOT)) {
            /* no need to epoll_ctl() */
        } else if (likely(!remain)) {
            if (ctl(e.fd, EPOLL_CTL_DEL, 0, ENOENT) < 0) { fail:
                LOG_ERROR_RETURN(0, -1, "failed to rm_interest()");
            }
        } else {
            auto events = evmap.translate_bitwisely(remain);
            if (remain & ONE_SHOT) events |= EPOLLONESHOT;
            if (ctl(e.fd, EPOLL_CTL_MOD, events) < 0) goto fail;
        }

        entry.interests ^= intersection; // ^ is to flip intersected bits
        if (intersection & EVENT_READ)  entry.reader_data = nullptr;
        if (intersection & EVENT_WRITE) entry.writer_data = nullptr;
        if (intersection & EVENT_ERROR) entry.error_data  = nullptr;
        return 0;
    }