Skip to content

Commit a9e311f

Browse files
committed
When rm_interest needs to re-arm other interests, add EPOLLONESHOT
1 parent a7597a9 commit a9e311f

File tree

4 files changed

+9
-2
lines changed

4 files changed

+9
-2
lines changed

io/epoll.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,18 +156,20 @@ class EventEngineEPoll : public MasterEventEngine, public CascadingEventEngine,
156156
virtual int rm_interest(Event e) override {
157157
if (e.fd < 0 || (size_t)e.fd >= _inflight_events.size())
158158
LOG_ERROR_RETURN(EINVAL, -1, "invalid file descriptor ", e.fd);
159-
if (unlikely(!e.interests)) return 0;
159+
if (unlikely(e.interests == 0)) return 0;
160160
auto& entry = _inflight_events[e.fd];
161161
auto intersection = e.interests & entry.interests & EVENT_RWE;
162162
if (intersection == 0) return 0;
163163

164164
int ret, op = 0; // ^ is to flip intersected bits
165165
auto x = (entry.interests ^ intersection) & EVENT_RWE;
166166
if (likely(e.interests & ONE_SHOT)) {
167+
// If e is ONE_SHOT, the entry must be ONE_SHOT as well
167168
if (!x) {
168169
ret = 0; // no need to epoll_ctl()
169170
} else {
170171
auto events = evmap.translate_bitwisely(x);
172+
events |= EPOLLONESHOT;
171173
ret = ctl(e.fd, EPOLL_CTL_MOD, events); // re-arm other interests
172174
}
173175
} else {
@@ -286,7 +288,7 @@ class EventEngineEPoll : public MasterEventEngine, public CascadingEventEngine,
286288
LOG_ERROR_RETURN(EINVAL, -1, "invalid fd");
287289
if (interest & (interest-1))
288290
LOG_ERROR_RETURN(EINVAL, -1, "can not wait for multiple interests");
289-
if (unlikely(!interest))
291+
if (unlikely(interest == 0))
290292
return rm_interest({fd, EVENT_RWE, 0}); // remove fd from epoll
291293
int ret = add_interest({fd, interest | ONE_SHOT, CURRENT});
292294
if (ret < 0) LOG_ERROR_RETURN(0, -1, "failed to add event interest");

io/iouring-wrapper.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,8 @@ class iouringEngine : public MasterEventEngine, public CascadingEventEngine, pub
224224
}
225225

226226
int wait_for_fd(int fd, uint32_t interests, uint64_t timeout) override {
227+
if (unlikely(interests == 0))
228+
return 0;
227229
unsigned poll_mask = evmap.translate_bitwisely(interests);
228230
// The io_uring_prep_poll_add's return value is the same as poll(2)'s revents.
229231
int ret = async_io(&io_uring_prep_poll_add, timeout, 0, fd, poll_mask);

io/kqueue.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ class KQueue : public MasterEventEngine, public CascadingEventEngine, public Res
8888
}
8989

9090
int wait_for_fd(int fd, uint32_t interests, uint64_t timeout) override {
91+
if (unlikely(interests == 0))
92+
return 0;
9193
short ev = (interests == EVENT_READ) ? EVFILT_READ : EVFILT_WRITE;
9294
enqueue(fd, ev, EV_ADD | EV_ONESHOT, 0, CURRENT);
9395
int ret = thread_usleep(timeout);

net/kernel_socket.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ class KernelSocketStream : public SocketStreamBase {
135135
return (Object*) (uint64_t) fd;
136136
}
137137
int close() final {
138+
get_vcpu()->master_event_engine->wait_for_fd(fd, 0, -1UL);
138139
auto ret = ::close(fd);
139140
fd = -1;
140141
return ret;

0 commit comments

Comments
 (0)