ioset_epoll_events(struct io_fd *fd)
{
return EPOLLHUP
- | (fd_wants_reads(fd) ? EPOLLIN : 0)
+ | EPOLLIN
| (fd_wants_writes(fd) ? EPOLLOUT : 0)
;
}
}
static void
-ioset_epoll_remove(struct io_fd *fd)
+ioset_epoll_remove(struct io_fd *fd, int closed)
{
static struct epoll_event evt;
- (void)epoll_ctl(epoll_fd, EPOLL_CTL_DEL, fd->fd, &evt);
+ if (!closed)
+ (void)epoll_ctl(epoll_fd, EPOLL_CTL_DEL, fd->fd, &evt);
}
static void
msec = timeout ? (timeout->tv_sec * 1000 + timeout->tv_usec / 1000) : -1;
res = epoll_wait(epoll_fd, evts, ArrayLength(evts), msec);
+ now = time(NULL) + clock_skew;
if (res < 0) {
if (errno != EINTR) {
log_module(MAIN_LOG, LOG_ERROR, "epoll_wait() error %d: %s", errno, strerror(errno));