Exemple #1
0
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);
	}
}
Exemple #2
0
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);
	}
}
Exemple #3
0
/**
 * @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;
}