Lines Matching refs:eloop

201 struct eloop {  struct
255 eloop_event_setup_fds(struct eloop *eloop) in eloop_event_setup_fds() argument
260 size_t nfds = eloop->nsignals; in eloop_event_setup_fds()
270 nfds += eloop->nevents * NFD; in eloop_event_setup_fds()
271 if (eloop->nfds < nfds) { in eloop_event_setup_fds()
272 pfd = eloop_realloca(eloop->fds, nfds, sizeof(*pfd)); in eloop_event_setup_fds()
275 eloop->fds = pfd; in eloop_event_setup_fds()
276 eloop->nfds = nfds; in eloop_event_setup_fds()
281 pfd = eloop->fds; in eloop_event_setup_fds()
283 TAILQ_FOREACH_SAFE(e, &eloop->events, next, ne) { in eloop_event_setup_fds()
285 TAILQ_REMOVE(&eloop->events, e, next); in eloop_event_setup_fds()
286 TAILQ_INSERT_TAIL(&eloop->free_events, e, next); in eloop_event_setup_fds()
302 eloop->events_need_setup = false; in eloop_event_setup_fds()
307 eloop_event_count(const struct eloop *eloop) in eloop_event_count() argument
310 return eloop->nevents; in eloop_event_count()
314 eloop_event_add(struct eloop *eloop, int fd, unsigned short events, in eloop_event_add() argument
327 assert(eloop != NULL); in eloop_event_add()
334 TAILQ_FOREACH(e, &eloop->events, next) { in eloop_event_add()
341 e = TAILQ_FIRST(&eloop->free_events); in eloop_event_add()
343 TAILQ_REMOVE(&eloop->free_events, e, next); in eloop_event_add()
350 TAILQ_INSERT_HEAD(&eloop->events, e, next); in eloop_event_add()
351 eloop->nevents++; in eloop_event_add()
381 if (n != 0 && _kevent(eloop->fd, ke, n, NULL, 0, NULL) == -1) { in eloop_event_add()
383 TAILQ_REMOVE(&eloop->events, e, next); in eloop_event_add()
384 TAILQ_INSERT_TAIL(&eloop->free_events, e, next); in eloop_event_add()
396 if (epe.events != 0 && epoll_ctl(eloop->fd, op, fd, &epe) == -1) { in eloop_event_add()
398 TAILQ_REMOVE(&eloop->events, e, next); in eloop_event_add()
399 TAILQ_INSERT_TAIL(&eloop->free_events, e, next); in eloop_event_add()
410 eloop->events_need_setup = true; in eloop_event_add()
415 eloop_event_delete(struct eloop *eloop, int fd) in eloop_event_delete() argument
423 assert(eloop != NULL); in eloop_event_delete()
429 TAILQ_FOREACH(e, &eloop->events, next) { in eloop_event_delete()
448 if (n != 0 && _kevent(eloop->fd, ke, n, NULL, 0, NULL) == -1) in eloop_event_delete()
451 if (epoll_ctl(eloop->fd, EPOLL_CTL_DEL, fd, NULL) == -1) in eloop_event_delete()
455 eloop->nevents--; in eloop_event_delete()
456 eloop->events_need_setup = true; in eloop_event_delete()
496 eloop_reduce_timers(struct eloop *eloop) in eloop_reduce_timers() argument
504 secs = eloop_timespec_diff(&now, &eloop->now, &nsecs); in eloop_reduce_timers()
506 TAILQ_FOREACH(t, &eloop->timeouts, next) { in eloop_reduce_timers()
525 eloop->now = now; in eloop_reduce_timers()
535 eloop_q_timeout_add(struct eloop *eloop, int queue, in eloop_q_timeout_add() argument
541 assert(eloop != NULL); in eloop_q_timeout_add()
546 TAILQ_FOREACH(t, &eloop->timeouts, next) { in eloop_q_timeout_add()
548 TAILQ_REMOVE(&eloop->timeouts, t, next); in eloop_q_timeout_add()
555 if ((t = TAILQ_FIRST(&eloop->free_timeouts))) { in eloop_q_timeout_add()
556 TAILQ_REMOVE(&eloop->free_timeouts, t, next); in eloop_q_timeout_add()
563 eloop_reduce_timers(eloop); in eloop_q_timeout_add()
573 TAILQ_FOREACH(tt, &eloop->timeouts, next) { in eloop_q_timeout_add()
581 TAILQ_INSERT_TAIL(&eloop->timeouts, t, next); in eloop_q_timeout_add()
586 eloop_q_timeout_add_tv(struct eloop *eloop, int queue, in eloop_q_timeout_add_tv() argument
599 return eloop_q_timeout_add(eloop, queue, in eloop_q_timeout_add_tv()
605 eloop_q_timeout_add_sec(struct eloop *eloop, int queue, unsigned int seconds, in eloop_q_timeout_add_sec() argument
609 return eloop_q_timeout_add(eloop, queue, seconds, 0, callback, arg); in eloop_q_timeout_add_sec()
613 eloop_q_timeout_add_msec(struct eloop *eloop, int queue, unsigned long when, in eloop_q_timeout_add_msec() argument
625 return eloop_q_timeout_add(eloop, queue, in eloop_q_timeout_add_msec()
630 eloop_q_timeout_delete(struct eloop *eloop, int queue, in eloop_q_timeout_delete() argument
636 assert(eloop != NULL); in eloop_q_timeout_delete()
639 TAILQ_FOREACH_SAFE(t, &eloop->timeouts, next, tt) { in eloop_q_timeout_delete()
644 TAILQ_REMOVE(&eloop->timeouts, t, next); in eloop_q_timeout_delete()
645 TAILQ_INSERT_TAIL(&eloop->free_timeouts, t, next); in eloop_q_timeout_delete()
653 eloop_exit(struct eloop *eloop, int code) in eloop_exit() argument
656 assert(eloop != NULL); in eloop_exit()
658 eloop->exitcode = code; in eloop_exit()
659 eloop->exitnow = true; in eloop_exit()
663 eloop_enter(struct eloop *eloop) in eloop_enter() argument
666 assert(eloop != NULL); in eloop_enter()
668 eloop->exitnow = false; in eloop_enter()
673 eloop_forked(struct eloop *eloop) in eloop_forked() argument
684 assert(eloop != NULL); in eloop_forked()
686 if (eloop->fd != -1) in eloop_forked()
687 close(eloop->fd); in eloop_forked()
688 if (eloop_open(eloop) == -1) in eloop_forked()
693 pfds = malloc((eloop->nsignals + (eloop->nevents * NFD)) * sizeof(*pfds)); in eloop_forked()
696 if (eloop->signal_cb != NULL) { in eloop_forked()
697 for (i = 0; i < eloop->nsignals; i++) { in eloop_forked()
698 EV_SET(pfd++, (uintptr_t)eloop->signals[i], in eloop_forked()
705 TAILQ_FOREACH(e, &eloop->events, next) { in eloop_forked()
726 if (epoll_ctl(eloop->fd, EPOLL_CTL_ADD, e->fd, &epe) == -1) in eloop_forked()
734 return _kevent(eloop->fd, pfds, i, NULL, 0, NULL); in eloop_forked()
739 UNUSED(eloop); in eloop_forked()
745 eloop_open(struct eloop *eloop) in eloop_open() argument
750 assert(eloop != NULL); in eloop_open()
768 eloop->fd = fd; in eloop_open()
771 UNUSED(eloop); in eloop_open()
777 eloop_signal_set_cb(struct eloop *eloop, in eloop_signal_set_cb() argument
787 assert(eloop != NULL); in eloop_signal_set_cb()
790 ke = kes = malloc(MAX(eloop->nsignals, nsignals) * sizeof(*kes)); in eloop_signal_set_cb()
793 for (i = 0; i < eloop->nsignals; i++) { in eloop_signal_set_cb()
794 EV_SET(ke++, (uintptr_t)eloop->signals[i], in eloop_signal_set_cb()
797 if (i != 0 && _kevent(eloop->fd, kes, i, NULL, 0, NULL) == -1) { in eloop_signal_set_cb()
803 eloop->signals = signals; in eloop_signal_set_cb()
804 eloop->nsignals = nsignals; in eloop_signal_set_cb()
805 eloop->signal_cb = signal_cb; in eloop_signal_set_cb()
806 eloop->signal_cb_ctx = signal_cb_ctx; in eloop_signal_set_cb()
812 for (i = 0; i < eloop->nsignals; i++) { in eloop_signal_set_cb()
813 EV_SET(ke++, (uintptr_t)eloop->signals[i], in eloop_signal_set_cb()
816 if (i != 0 && _kevent(eloop->fd, kes, i, NULL, 0, NULL) == -1) in eloop_signal_set_cb()
846 eloop_signal_mask(struct eloop *eloop, sigset_t *oldset) in eloop_signal_mask() argument
857 assert(eloop != NULL); in eloop_signal_mask()
860 for (i = 0; i < eloop->nsignals; i++) in eloop_signal_mask()
861 sigaddset(&newset, eloop->signals[i]); in eloop_signal_mask()
868 for (i = 0; i < eloop->nsignals; i++) { in eloop_signal_mask()
869 if (sigaction(eloop->signals[i], &sa, NULL) == -1) in eloop_signal_mask()
877 struct eloop *
880 struct eloop *eloop; in eloop_new() local
882 eloop = calloc(1, sizeof(*eloop)); in eloop_new()
883 if (eloop == NULL) in eloop_new()
887 if (clock_gettime(CLOCK_MONOTONIC, &eloop->now) == -1) { in eloop_new()
888 free(eloop); in eloop_new()
892 TAILQ_INIT(&eloop->events); in eloop_new()
893 TAILQ_INIT(&eloop->free_events); in eloop_new()
894 TAILQ_INIT(&eloop->timeouts); in eloop_new()
895 TAILQ_INIT(&eloop->free_timeouts); in eloop_new()
896 eloop->exitcode = EXIT_FAILURE; in eloop_new()
899 if (eloop_open(eloop) == -1) { in eloop_new()
900 eloop_free(eloop); in eloop_new()
905 return eloop; in eloop_new()
909 eloop_clear(struct eloop *eloop, ...) in eloop_clear() argument
916 if (eloop == NULL) in eloop_clear()
919 va_start(va1, eloop); in eloop_clear()
920 TAILQ_FOREACH_SAFE(e, &eloop->events, next, ne) { in eloop_clear()
928 TAILQ_REMOVE(&eloop->events, e, next); in eloop_clear()
931 eloop->nevents--; in eloop_clear()
941 free(eloop->fds); in eloop_clear()
942 eloop->fds = NULL; in eloop_clear()
943 eloop->nfds = 0; in eloop_clear()
944 eloop->events_need_setup = true; in eloop_clear()
947 while ((e = TAILQ_FIRST(&eloop->free_events))) { in eloop_clear()
948 TAILQ_REMOVE(&eloop->free_events, e, next); in eloop_clear()
951 while ((t = TAILQ_FIRST(&eloop->timeouts))) { in eloop_clear()
952 TAILQ_REMOVE(&eloop->timeouts, t, next); in eloop_clear()
955 while ((t = TAILQ_FIRST(&eloop->free_timeouts))) { in eloop_clear()
956 TAILQ_REMOVE(&eloop->free_timeouts, t, next); in eloop_clear()
959 eloop->cleared = true; in eloop_clear()
963 eloop_free(struct eloop *eloop) in eloop_free() argument
966 eloop_clear(eloop, -1); in eloop_free()
968 if (eloop != NULL && eloop->fd != -1) in eloop_free()
969 close(eloop->fd); in eloop_free()
971 free(eloop); in eloop_free()
976 eloop_run_kqueue(struct eloop *eloop, const struct timespec *ts) in eloop_run_kqueue() argument
983 n = _kevent(eloop->fd, NULL, 0, eloop->fds, eloop->nevents, ts); in eloop_run_kqueue()
987 for (nn = n, ke = eloop->fds; nn != 0; nn--, ke++) { in eloop_run_kqueue()
988 if (eloop->cleared || eloop->exitnow) in eloop_run_kqueue()
992 eloop->signal_cb((int)ke->ident, in eloop_run_kqueue()
993 eloop->signal_cb_ctx); in eloop_run_kqueue()
1022 eloop_run_epoll(struct eloop *eloop, in eloop_run_epoll() argument
1042 n = epoll_pwait(eloop->fd, eloop->fds, in eloop_run_epoll()
1043 (int)eloop->nevents, timeout, signals); in eloop_run_epoll()
1045 n = epoll_wait(eloop->fd, eloop->fds, in eloop_run_epoll()
1046 (int)eloop->nevents, timeout); in eloop_run_epoll()
1050 for (nn = n, epe = eloop->fds; nn != 0; nn--, epe++) { in eloop_run_epoll()
1051 if (eloop->cleared || eloop->exitnow) in eloop_run_epoll()
1073 eloop_run_ppoll(struct eloop *eloop, in eloop_run_ppoll() argument
1081 n = ppoll(eloop->fds, (nfds_t)eloop->nevents, ts, signals); in eloop_run_ppoll()
1086 TAILQ_FOREACH(e, &eloop->events, next) { in eloop_run_ppoll()
1087 if (eloop->cleared || eloop->exitnow) in eloop_run_ppoll()
1117 eloop_run_pselect(struct eloop *eloop, in eloop_run_pselect() argument
1128 TAILQ_FOREACH(e, &eloop->events, next) { in eloop_run_pselect()
1148 TAILQ_FOREACH(e, &eloop->events, next) { in eloop_run_pselect()
1149 if (eloop->cleared || eloop->exitnow) in eloop_run_pselect()
1167 eloop_start(struct eloop *eloop, sigset_t *signals) in eloop_start() argument
1173 assert(eloop != NULL); in eloop_start()
1179 if (eloop->exitnow) in eloop_start()
1186 if (eloop->signal_cb != NULL) in eloop_start()
1187 eloop->signal_cb(n, eloop->signal_cb_ctx); in eloop_start()
1192 t = TAILQ_FIRST(&eloop->timeouts); in eloop_start()
1193 if (t == NULL && eloop->nevents == 0) in eloop_start()
1197 eloop_reduce_timers(eloop); in eloop_start()
1200 TAILQ_REMOVE(&eloop->timeouts, t, next); in eloop_start()
1202 TAILQ_INSERT_TAIL(&eloop->free_timeouts, t, next); in eloop_start()
1218 eloop->cleared = false; in eloop_start()
1219 if (eloop->events_need_setup) in eloop_start()
1220 eloop_event_setup_fds(eloop); in eloop_start()
1224 error = eloop_run_kqueue(eloop, tsp); in eloop_start()
1226 error = eloop_run_epoll(eloop, tsp, signals); in eloop_start()
1228 error = eloop_run_ppoll(eloop, tsp, signals); in eloop_start()
1230 error = eloop_run_pselect(eloop, tsp, signals); in eloop_start()
1241 return eloop->exitcode; in eloop_start()