Skip to content

Commit fed3480

Browse files
committed
Fix tests
1 parent e87afd4 commit fed3480

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

include/swoole_reactor.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,10 @@ class Reactor {
261261
return !_socket->removed && _socket->events;
262262
}
263263

264+
bool exists(const int fd) const {
265+
return sockets_.find(fd) != sockets_.end();
266+
}
267+
264268
int get_timeout_msec() const {
265269
return defer_tasks == nullptr ? timeout_msec : 0;
266270
}

src/reactor/poll.cc

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ int ReactorPoll::del(Socket *socket) {
141141
swoole_print_backtrace_on_error();
142142
return SW_ERR;
143143
}
144-
144+
swoole_trace("fd=%d", socket->fd);
145145
reactor_->_del(socket);
146146
return SW_OK;
147147
}
@@ -169,6 +169,18 @@ int ReactorPoll::wait() {
169169
SW_REACTOR_CONTINUE;
170170
} else {
171171
for (int i = 0; i < event_num; i++) {
172+
/**
173+
* A revents value of 0 indicates that no events have occurred on this socket,
174+
* so the next file descriptor should be checked;
175+
* likewise, if the file descriptor has already been removed, it should be skipped.
176+
* It is essential to check whether this file descriptor exists in the reactor,
177+
* as the event handler may remove a file descriptor with pending but already triggered readable or
178+
* writable events that have not yet been processed.
179+
*/
180+
if (events_[i].revents == 0 || !reactor_->exists(events_[i].fd)) {
181+
continue;
182+
}
183+
172184
event.socket = reactor_->get_socket(events_[i].fd);
173185
event.fd = events_[i].fd;
174186
event.reactor_id = reactor_->id;
@@ -244,7 +256,7 @@ int translate_events_from_poll(int16_t events) {
244256
sw_events |= SW_EVENT_WRITE;
245257
}
246258
// ignore ERR and HUP, because event is already processed at IN and OUT handler.
247-
if ((((events & POLLERR) || (events & POLLHUP)) && !((events & POLLIN) || (events & POLLOUT)))) {
259+
if ((events & POLLERR || events & POLLHUP) && !(events & POLLIN || events & POLLOUT)) {
248260
sw_events |= SW_EVENT_ERROR;
249261
}
250262

0 commit comments

Comments
 (0)