Skip to content

Commit 8c317b2

Browse files
author
logwang
committed
Fix #107: some invalid usages of kqueue in ff_epoll.
1.Both EVFILT_READ and EVFILT_WRITE are values but not flags. It needs to check whether it is equal but not to do logic and. 2.If the read direction of the socket has shutdown, then the filter also sets EV_EOF in `flags`, and returns the socket error (if any) in `fflags`.
1 parent e76966d commit 8c317b2

File tree

1 file changed

+16
-5
lines changed

1 file changed

+16
-5
lines changed

lib/ff_epoll.c

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,11 @@ ff_event_to_epoll(void **ev, struct kevent *kev)
6969
unsigned int event_one = 0;
7070
struct epoll_event **ppev = (struct epoll_event **)ev;
7171

72-
if (kev->filter & EVFILT_READ) {
73-
event_one |= EPOLLIN;
74-
}
75-
if (kev->filter & EVFILT_WRITE) {
72+
if (kev->filter == EVFILT_READ) {
73+
if (kev->data || !(kev->flags & EV_EOF)) {
74+
event_one |= EPOLLIN;
75+
}
76+
} else if (kev->filter == EVFILT_WRITE) {
7677
event_one |= EPOLLOUT;
7778
}
7879

@@ -81,7 +82,17 @@ ff_event_to_epoll(void **ev, struct kevent *kev)
8182
}
8283

8384
if (kev->flags & EV_EOF) {
84-
event_one |= EPOLLIN;
85+
event_one |= EPOLLHUP;
86+
87+
if (kev->fflags) {
88+
event_one |= EPOLLERR;
89+
}
90+
91+
if (kev->filter == EVFILT_READ) {
92+
event_one |= EPOLLIN;
93+
} else if (kev->filter == EVFILT_WRITE) {
94+
event_one |= EPOLLERR;
95+
}
8596
}
8697

8798
(*ppev)->events = event_one;

0 commit comments

Comments
 (0)