static void event_callback(evutil_socket_t fd, short evtype, void *e){ onion_poller_slot *s=e; int res=s->f(s->data); if (res<0){ onion_poller_slot_free(s); } }
static void event_callback(struct ev_loop *loop, ev_io *w, int revents){ onion_poller_slot *s=w->data; int res=s->f(s->data); if (res<0){ onion_poller_slot_free(s); } }
/** * @short Removes a file descriptor, and all related callbacks from the listening queue * @memberof onion_poller_t * @ingroup poller */ int onion_poller_remove(onion_poller *poller, int fd){ if (epoll_ctl(poller->fd, EPOLL_CTL_DEL, fd, NULL) < 0){ if (errno!=ENOENT && errno!=EBADF){ ONION_ERROR("Error remove descriptor to listen to. %s (%d)", strerror(errno), errno); } } pthread_mutex_lock(&poller->mutex); ONION_DEBUG0("Trying to remove fd %d (%d)", fd, poller->n); onion_poller_slot *el=poller->head; if (el && el->fd==fd){ ONION_DEBUG0("Removed from head %p", el); poller->head=el->next; pthread_mutex_unlock(&poller->mutex); onion_poller_slot_free(el); return 0; } while (el->next){ if (el->next->fd==fd){ ONION_DEBUG0("Removed from tail %p",el); onion_poller_slot *t=el->next; el->next=t->next; if (poller->head->next==NULL){ // This means only eventfd is here. ONION_DEBUG0("Removed last, stopping poll"); onion_poller_stop(poller); } pthread_mutex_unlock(&poller->mutex); onion_poller_slot_free(t); return 0; } el=el->next; } pthread_mutex_unlock(&poller->mutex); ONION_WARNING("Trying to remove unknown fd from poller %d", fd); return 0; }