ioloop.c revision 90da11b31d498cd653ec7232b334b6057198ab46
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen/* Copyright (c) 2002-2003 Timo Sirainen */
4ef1f9f3293965734e6e3c38c191ceb2246a721fTeemu Huovilastruct io *io_add(int fd, enum io_condition condition,
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen return io_loop_notify_add(current_ioloop, fd, condition,
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen io = p_new(current_ioloop->pool, struct io, 1);
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen /* have to append it, or io_destroy() breaks */
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen /* notify the real I/O handler */
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainenstatic void timeout_list_insert(struct ioloop *ioloop, struct timeout *timeout)
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen for (t = &ioloop->timeouts; *t != NULL; t = &(*t)->next) {
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainenstatic void timeout_update_next(struct timeout *timeout, struct timeval *tv_now)
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen if (gettimeofday(&timeout->next_run, NULL) < 0)
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen /* we don't want microsecond accuracy or this function will be
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen called all the time - millisecond is more than enough */
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen timeout->next_run.tv_usec -= timeout->next_run.tv_usec % 1000;
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen timeout->next_run.tv_sec += timeout->msecs/1000;
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen timeout->next_run.tv_usec += (timeout->msecs%1000)*1000;
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainenstruct timeout *timeout_add(unsigned int msecs, timeout_callback_t *callback,
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen timeout = p_new(current_ioloop->pool, struct timeout, 1);
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen timeout_update_next(timeout, current_ioloop->running ?
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainenvoid timeout_destroy(struct ioloop *ioloop, struct timeout **timeout_p)
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainenint io_loop_get_wait_time(struct timeout *timeout, struct timeval *tv,
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen /* no timeouts. give it INT_MAX msecs. */
2730605833442b5ddcb261f90b8375fc98201e35Timo Sirainen tv->tv_sec = timeout->next_run.tv_sec - tv->tv_sec;
2730605833442b5ddcb261f90b8375fc98201e35Timo Sirainen tv->tv_usec = timeout->next_run.tv_usec - tv->tv_usec;
2bb1ef0b669901fb91ff961e7fb074439ef769abTimo Sirainen if (tv->tv_sec > 0 || (tv->tv_sec == 0 && tv->tv_usec > 0))
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen /* no need to calculate the times again with this timeout */
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainenvoid io_loop_handle_timeouts(struct ioloop *ioloop)
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen unsigned int t_id;
3dc5a231160859c9627157dc53a94d5e4494fe9fTeemu Huovila if (gettimeofday(&ioloop_timeval, &ioloop_timezone) < 0)
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen if (ioloop->timeouts == NULL || !ioloop->timeouts->run_now)
3dc5a231160859c9627157dc53a94d5e4494fe9fTeemu Huovila for (t = ioloop->timeouts; t != NULL; t = *t_p) {
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen io_loop_get_wait_time(t, &tv, &ioloop_timeval);
if (!t->run_now)
return ioloop;