in io/epoll-ng.cpp [182:203]
virtual int add_interest(Event e) override {
if (e.fd < 0)
LOG_ERROR_RETURN(EINVAL, -1, "invalid file descriptor ", e.fd);
int ret = 0;
int mod = (e.interests & ONE_SHOT) ? EPOLLONESHOT : 0;
if (e.interests & EVENT_READ) {
ret =
rpoller.add(e.fd, mod | EPOLLIN | EPOLLRDHUP, {.ptr = e.data});
if (ret < 0) return ret;
}
DEFER(if (ret < 0) rpoller.rm(e.fd, 0, {}));
if (e.interests & EVENT_WRITE) {
ret = wpoller.add(e.fd, mod | EPOLLOUT, {.ptr = e.data});
if (ret < 0) return ret;
}
DEFER(if (ret < 0) wpoller.rm(e.fd, 0, {}));
if (e.interests & EVENT_ERROR) {
ret = epoller.add(e.fd, mod | EPOLLERR, {.ptr = e.data});
if (ret < 0) return ret;
}
return ret;
}