static void eventer_kqueue_impl_update(eventer_t e, int mask) { if(e->mask & EVENTER_TIMER) { eventer_update_timed(e, mask); return; } noitL(eventer_deb, "kqueue: update(%d, %x->%x)\n", e->fd, e->mask, mask); /* Disable old, if they aren't active in the new */ if((e->mask & (EVENTER_READ | EVENTER_EXCEPTION)) && !(mask & (EVENTER_READ | EVENTER_EXCEPTION))) ke_change(e->fd, EVFILT_READ, EV_DELETE | EV_DISABLE, e); if((e->mask & (EVENTER_WRITE)) && !(mask & (EVENTER_WRITE))) ke_change(e->fd, EVFILT_WRITE, EV_DELETE | EV_DISABLE, e); /* Enable new, if the weren't in the old */ if((mask & (EVENTER_READ | EVENTER_EXCEPTION)) && !(e->mask & (EVENTER_READ | EVENTER_EXCEPTION))) ke_change(e->fd, EVFILT_READ, EV_ADD | EV_ENABLE, e); if((mask & (EVENTER_WRITE)) && !(e->mask & (EVENTER_WRITE))) ke_change(e->fd, EVFILT_WRITE, EV_ADD | EV_ENABLE, e); /* Switch */ e->mask = mask; }
static void eventer_epoll_impl_update(eventer_t e, int mask) { struct epoll_event _ev; int ctl_op = EPOLL_CTL_MOD; if(e->mask & EVENTER_TIMER) { eventer_update_timed(e,mask); return; } memset(&_ev, 0, sizeof(_ev)); _ev.data.fd = e->fd; if(e->mask == 0) ctl_op = EPOLL_CTL_ADD; e->mask = mask; if(e->mask & (EVENTER_READ | EVENTER_WRITE | EVENTER_EXCEPTION)) { struct epoll_spec *spec; spec = eventer_get_spec_for_event(e); if(e->mask & EVENTER_READ) _ev.events |= (EPOLLIN|EPOLLPRI); if(e->mask & EVENTER_WRITE) _ev.events |= (EPOLLOUT); if(e->mask & EVENTER_EXCEPTION) _ev.events |= (EPOLLERR|EPOLLHUP); mtevL(eventer_deb, "epoll_ctl(%d, %s, %d)\n", spec->epoll_fd, ctl_op == EPOLL_CTL_ADD ? "add" : "mod", e->fd); int epoll_rv = epoll_ctl(spec->epoll_fd, ctl_op, e->fd, &_ev); if(epoll_rv != 0 && ((ctl_op == EPOLL_CTL_ADD && errno == EEXIST) || (ctl_op == EPOLL_CTL_MOD && errno == ENOENT))) { /* try the other way */ ctl_op = (ctl_op == EPOLL_CTL_ADD) ? EPOLL_CTL_MOD : EPOLL_CTL_ADD; epoll_rv = epoll_ctl(spec->epoll_fd, ctl_op, e->fd, &_ev); if (epoll_rv != 0) { mtevFatal(mtev_error, "epoll_ctl(%d, %s, %d) -> %s\n", spec->epoll_fd, ctl_op == EPOLL_CTL_ADD ? "add" : "mod", e->fd, strerror(errno)); } } } }
static void eventer_ports_impl_update(eventer_t e, int mask) { if(e->mask & EVENTER_TIMER) { eventer_update_timed(e,mask); return; } alter_fd(e, mask); e->mask = mask; }
static void eventer_epoll_impl_update(eventer_t e, int mask) { struct epoll_event _ev; if(e->mask & EVENTER_TIMER) { eventer_update_timed(e,mask); return; } memset(&_ev, 0, sizeof(_ev)); _ev.data.fd = e->fd; e->mask = mask; if(e->mask & (EVENTER_READ | EVENTER_WRITE | EVENTER_EXCEPTION)) { if(e->mask & EVENTER_READ) _ev.events |= (EPOLLIN|EPOLLPRI); if(e->mask & EVENTER_WRITE) _ev.events |= (EPOLLOUT); if(e->mask & EVENTER_EXCEPTION) _ev.events |= (EPOLLERR|EPOLLHUP); assert(epoll_ctl(epoll_fd, EPOLL_CTL_MOD, e->fd, &_ev) == 0); } }
static void eventer_epoll_impl_update(eventer_t e, int mask) { struct epoll_event _ev; if(e->mask & EVENTER_TIMER) { eventer_update_timed(e,mask); return; } memset(&_ev, 0, sizeof(_ev)); _ev.data.fd = e->fd; e->mask = mask; if(e->mask & (EVENTER_READ | EVENTER_WRITE | EVENTER_EXCEPTION)) { struct epoll_spec *spec; spec = eventer_get_spec_for_event(e); if(e->mask & EVENTER_READ) _ev.events |= (EPOLLIN|EPOLLPRI); if(e->mask & EVENTER_WRITE) _ev.events |= (EPOLLOUT); if(e->mask & EVENTER_EXCEPTION) _ev.events |= (EPOLLERR|EPOLLHUP); if(epoll_ctl(spec->epoll_fd, EPOLL_CTL_MOD, e->fd, &_ev) != 0) { mtevFatal(mtev_error, "epoll_ctl(%d, EPOLL_CTL_MOD, %d) -> %s\n", spec->epoll_fd, e->fd, strerror(errno)); } } }