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