fix kqueue eof event

This commit is contained in:
zixun
2018-07-05 18:35:43 +08:00
committed by 云风
parent 0e41231298
commit 1df72c0afe
4 changed files with 10 additions and 2 deletions

View File

@@ -60,6 +60,7 @@ sp_wait(int efd, struct event *e, int max) {
e[i].write = (flag & EPOLLOUT) != 0;
e[i].read = (flag & (EPOLLIN | EPOLLHUP)) != 0;
e[i].error = (flag & EPOLLERR) != 0;
e[i].eof = false;
}
return n;

View File

@@ -73,9 +73,11 @@ sp_wait(int kfd, struct event *e, int max) {
for (i=0;i<n;i++) {
e[i].s = ev[i].udata;
unsigned filter = ev[i].filter;
e[i].write = (filter == EVFILT_WRITE);
e[i].read = (filter == EVFILT_READ);
bool eof = (ev[i].flags & EV_EOF) != 0;
e[i].write = (filter == EVFILT_WRITE) && (!eof);
e[i].read = (filter == EVFILT_READ) && (!eof);
e[i].error = false; // kevent has not error event
e[i].eof = eof;
}
return n;

View File

@@ -10,6 +10,7 @@ struct event {
bool read;
bool write;
bool error;
bool eof;
};
static bool sp_invalid(poll_fd fd);

View File

@@ -1461,6 +1461,10 @@ socket_server_poll(struct socket_server *ss, struct socket_message * result, int
result->data = (char *)err;
return SOCKET_ERR;
}
if(e->eof) {
force_close(ss, s, &l, result);
return SOCKET_CLOSE;
}
break;
}
}