#define container_of(ptr, type, member) ((type *)((char *)(ptr) - offsetof(type, member)))
struct polldata {
uv_poll_t uv;
- int events, revents, fd;
+ int events, revents, fd, dead;
};
static polldata *uvpoll[NETPOLL_MAXFDS] = {};
static uv_loop_t *uvloop = 0;
poll->events = 0;
poll->revents = 0;
poll->fd = fds[i].fd;
+ poll->dead = 0;
uv_poll_init_socket(uvloop, &poll->uv, fds[i].fd);
if (lastptr >= i)
lastptr++;
uv_poll_stop(handle);
if (status == -EBADF) {
fprintf(stderr, "netpoll::cb: %d EBADF!\n", poll->fd);
- del_and_close(poll->fd);
+ poll->dead = 1;
+ poll->revents = poll->events & (UV_READABLE | UV_WRITABLE);
}
lastptr = 0;
}
int begin(void)
{
for (int i = 0; i < nfds; i++) {
- uv_poll_start(&uvpoll[i]->uv, uvpoll[i]->events, cb);
- uvpoll[i]->revents = 0;
+ if (uvpoll[i]->dead == 0) {
+ uv_poll_start(&uvpoll[i]->uv, uvpoll[i]->events, cb);
+ uvpoll[i]->revents = 0;
+ } else {
+ uvpoll[i]->revents = uvpoll[i]->events & (UV_READABLE | UV_WRITABLE);
+ }
}
uv_run(uvloop, UV_RUN_ONCE);
return 0;