static eventer_t eventer_epoll_impl_remove(eventer_t e) { eventer_t removed = NULL; if(e->mask & EVENTER_ASYNCH) { abort(); } if(e->mask & (EVENTER_READ | EVENTER_WRITE | EVENTER_EXCEPTION)) { ev_lock_state_t lockstate; struct epoll_event _ev; memset(&_ev, 0, sizeof(_ev)); _ev.data.fd = e->fd; lockstate = acquire_master_fd(e->fd); if(e == master_fds[e->fd].e) { removed = e; master_fds[e->fd].e = NULL; assert(epoll_ctl(epoll_fd, EPOLL_CTL_DEL, e->fd, &_ev) == 0); } release_master_fd(e->fd, lockstate); } else if(e->mask & EVENTER_TIMER) { removed = eventer_remove_timed(e); } else if(e->mask & EVENTER_RECURRENT) { removed = eventer_remove_recurrent(e); } else { abort(); } return removed; }
static eventer_t eventer_ports_impl_remove(eventer_t e) { eventer_t removed = NULL; if(e->mask & EVENTER_ASYNCH) { mtevFatal(mtev_error, "error in eventer_ports_impl_remove: got unexpected EVENTER_ASYNCH mask\n"); } if(e->mask & (EVENTER_READ | EVENTER_WRITE | EVENTER_EXCEPTION)) { ev_lock_state_t lockstate; lockstate = acquire_master_fd(e->fd); if(e == master_fds[e->fd].e) { removed = e; master_fds[e->fd].e = NULL; alter_fd(e, 0); } release_master_fd(e->fd, lockstate); } else if(e->mask & EVENTER_TIMER) { removed = eventer_remove_timed(e); } else if(e->mask & EVENTER_RECURRENT) { removed = eventer_remove_recurrent(e); } else { mtevFatal(mtev_error, "error in eventer_ports_impl_remove: got unknown mask (0x%04x)\n", e->mask); } return removed; }
static eventer_t eventer_ports_impl_remove(eventer_t e) { eventer_t removed = NULL; if(e->mask & EVENTER_ASYNCH) { abort(); } if(e->mask & (EVENTER_READ | EVENTER_WRITE | EVENTER_EXCEPTION)) { ev_lock_state_t lockstate; lockstate = acquire_master_fd(e->fd); if(e == master_fds[e->fd].e) { removed = e; master_fds[e->fd].e = NULL; alter_fd(e, 0); } release_master_fd(e->fd, lockstate); } else if(e->mask & EVENTER_TIMER) { removed = eventer_remove_timed(e); } else if(e->mask & EVENTER_RECURRENT) { removed = eventer_remove_recurrent(e); } else { abort(); } return removed; }
static eventer_t eventer_kqueue_impl_remove(eventer_t e) { eventer_t removed = NULL; if(e->mask & EVENTER_ASYNCH) { abort(); } if(e->mask & (EVENTER_READ | EVENTER_WRITE | EVENTER_EXCEPTION)) { ev_lock_state_t lockstate; lockstate = acquire_master_fd(e->fd); noitL(eventer_deb, "kqueue: remove(%d)\n", e->fd); if(e == master_fds[e->fd].e) { removed = e; master_fds[e->fd].e = NULL; if(e->mask & (EVENTER_READ | EVENTER_EXCEPTION)) ke_change(e->fd, EVFILT_READ, EV_DELETE | EV_DISABLE, e); if(e->mask & (EVENTER_WRITE)) ke_change(e->fd, EVFILT_WRITE, EV_DELETE | EV_DISABLE, e); } else noitL(eventer_deb, "kqueue: remove(%d) failed.\n", e->fd); release_master_fd(e->fd, lockstate); } else if(e->mask & EVENTER_TIMER) { removed = eventer_remove_timed(e); } else if(e->mask & EVENTER_RECURRENT) { removed = eventer_remove_recurrent(e); } else { abort(); } return removed; }
static eventer_t eventer_kqueue_impl_remove(eventer_t e) { eventer_t removed = NULL; if(e->mask & EVENTER_ASYNCH) { mtevFatal(mtev_error, "error in eventer_kqueue_impl_remove: got unexpected EVENTER_ASYNCH mask\n"); } if(e->mask & (EVENTER_READ | EVENTER_WRITE | EVENTER_EXCEPTION)) { ev_lock_state_t lockstate; lockstate = acquire_master_fd(e->fd); mtevL(eventer_deb, "kqueue: remove(%d)\n", e->fd); if(e == master_fds[e->fd].e) { removed = e; master_fds[e->fd].e = NULL; if(e->mask & (EVENTER_READ | EVENTER_EXCEPTION)) ke_change(e->fd, EVFILT_READ, EV_DELETE | EV_DISABLE, e); if(e->mask & (EVENTER_WRITE)) ke_change(e->fd, EVFILT_WRITE, EV_DELETE | EV_DISABLE, e); } else mtevL(eventer_deb, "kqueue: remove(%d) failed.\n", e->fd); release_master_fd(e->fd, lockstate); } else if(e->mask & EVENTER_TIMER) { removed = eventer_remove_timed(e); } else if(e->mask & EVENTER_RECURRENT) { removed = eventer_remove_recurrent(e); } else { mtevFatal(mtev_error, "error in eventer_kqueue_impl_remove: got unknown mask (0x%04x)\n", e->mask); } return removed; }
static eventer_t eventer_epoll_impl_remove(eventer_t e) { struct epoll_spec *spec; eventer_t removed = NULL; if(e->mask & EVENTER_ASYNCH) { mtevFatal(mtev_error, "error in eventer_epoll_impl_remove: got unexpected EVENTER_ASYNCH mask\n"); } if(e->mask & (EVENTER_READ | EVENTER_WRITE | EVENTER_EXCEPTION)) { ev_lock_state_t lockstate; struct epoll_event _ev; spec = eventer_get_spec_for_event(e); memset(&_ev, 0, sizeof(_ev)); _ev.data.fd = e->fd; lockstate = acquire_master_fd(e->fd); if(e == master_fds[e->fd].e) { removed = e; master_fds[e->fd].e = NULL; mtevL(eventer_deb, "epoll_ctl(%d, del, %d)\n", spec->epoll_fd, e->fd); if(epoll_ctl(spec->epoll_fd, EPOLL_CTL_DEL, e->fd, &_ev) != 0) { mtevL(mtev_error, "epoll_ctl(%d, EPOLL_CTL_DEL, %d) -> %s\n", spec->epoll_fd, e->fd, strerror(errno)); if(errno != ENOENT) { mtevFatal(mtev_error, "errno != ENOENT: %d (%s)\n", errno, strerror(errno)); } } } release_master_fd(e->fd, lockstate); } else if(e->mask & EVENTER_TIMER) { removed = eventer_remove_timed(e); } else if(e->mask & EVENTER_RECURRENT) { removed = eventer_remove_recurrent(e); } else { mtevFatal(mtev_error, "error in eventer_epoll_impl_remove: got unknown mask (0x%04x)\n", e->mask); } return removed; }