void mowgli_simple_eventloop_timeout_once(mowgli_eventloop_t *eventloop, int timeout) { time_t delay, currtime; int t; return_if_fail(eventloop != NULL); return_if_fail(eventloop->eventloop_ops != NULL); mowgli_eventloop_synchronize(eventloop); currtime = mowgli_eventloop_get_time(eventloop); delay = mowgli_eventloop_next_timer(eventloop); while (delay <= currtime) { mowgli_eventloop_run_timers(eventloop); mowgli_eventloop_synchronize(eventloop); currtime = mowgli_eventloop_get_time(eventloop); delay = mowgli_eventloop_next_timer(eventloop); } if (timeout) t = timeout; else t = (delay - currtime) * 1000; #ifdef DEBUG mowgli_log("delay: %ld, currtime: %ld, select period: %d", delay, currtime, t); #endif eventloop->eventloop_ops->select(eventloop, t); }
static void mowgli_epoll_eventloop_select(mowgli_eventloop_t *eventloop, int delay) { mowgli_epoll_eventloop_private_t *priv; int i, num, o_errno; return_if_fail(eventloop != NULL); priv = eventloop->poller; num = epoll_wait(priv->epoll_fd, priv->pfd, priv->pfd_size, delay); o_errno = errno; mowgli_eventloop_synchronize(eventloop); if (num < 0) { if (mowgli_eventloop_ignore_errno(errno)) return; mowgli_log("mowgli_epoll_eventloop_select(): epoll_wait failed: %d (%s)", o_errno, strerror(o_errno)); return; } for (i = 0; i < num; i++) { mowgli_eventloop_pollable_t *pollable = priv->pfd[i].data.ptr; if (priv->pfd[i].events & (EPOLLIN | EPOLLHUP | EPOLLERR)) mowgli_pollable_trigger(eventloop, pollable, MOWGLI_EVENTLOOP_IO_READ); if (priv->pfd[i].events & (EPOLLOUT | EPOLLHUP | EPOLLERR)) mowgli_pollable_trigger(eventloop, pollable, MOWGLI_EVENTLOOP_IO_WRITE); } }