ioloop.c revision eef4c69e0c1759aaaddcef341c817bb1e374ed24
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen Copyright (c) 2002 Timo Sirainen
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen Permission is hereby granted, free of charge, to any person obtaining
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen a copy of this software and associated documentation files (the
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen "Software"), to deal in the Software without restriction, including
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen without limitation the rights to use, copy, modify, merge, publish,
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen distribute, sublicense, and/or sell copies of the Software, and to
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen permit persons to whom the Software is furnished to do so, subject to
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen the following conditions:
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen The above copyright notice and this permission notice shall be
beffc30d933c5e134c45cc871852a8427eba7e70Timo Sirainen included in all copies or substantial portions of the Software.
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen/* FIXME: inserting IO is slow if there's lots of them. I should add a linked
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen list of priorities pointing to first item in the list with the priority. */
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen for (io = ioloop->ios; io != NULL; io = io->next) {
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen if (!io->destroyed && io->fd > ioloop->highest_fd) {
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainenstatic void io_list_insert(IOLoop ioloop, IO io)
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen for (next = ioloop->ios; next != NULL; next = next->next) {
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo SirainenIO io_add(int fd, int condition, IOFunc func, void *data)
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen return io_add_priority(fd, IO_PRIORITY_DEFAULT,
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo SirainenIO io_add_priority(int fd, int priority, int condition,
beffc30d933c5e134c45cc871852a8427eba7e70Timo Sirainen io = p_new(current_ioloop->pool, struct _IO, 1);
beffc30d933c5e134c45cc871852a8427eba7e70Timo Sirainen io_loop_handle_add(current_ioloop, io->fd, io->condition);
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen i_assert(io->fd <= current_ioloop->highest_fd);
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen /* notify the real I/O handler */
beffc30d933c5e134c45cc871852a8427eba7e70Timo Sirainen io_loop_handle_remove(current_ioloop, io->fd, io->condition);
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen /* check if we removed the highest fd */
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen /* remove from list */
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainenstatic void timeout_list_insert(IOLoop ioloop, Timeout timeout)
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen for (t = &ioloop->timeouts; *t != NULL; t = &(*t)->next) {
4ce6338bf945cccfff9e4ce7cc6aa2246851b84aTimo Siraineninline static void timeout_update_next(Timeout timeout, struct timeval *tv_now)
beffc30d933c5e134c45cc871852a8427eba7e70Timo Sirainen /* we don't want microsecond accuracy or this function will be
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen called all the time - millisecond is more than enough */
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen timeout->next_run.tv_sec += timeout->msecs/1000;
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen timeout->next_run.tv_usec += (timeout->msecs%1000)*1000;
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo SirainenTimeout timeout_add(int msecs, TimeoutFunc func, void *context)
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen timeout = p_new(current_ioloop->pool, struct _Timeout, 1);
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen timeout_update_next(timeout, current_ioloop->running ?
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainenvoid timeout_destroy(IOLoop ioloop, Timeout timeout)
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen for (t = &ioloop->timeouts; *t != NULL; t = &(*t)->next) {
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainenint io_loop_get_wait_time(Timeout timeout, struct timeval *tv,
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen tv->tv_sec = timeout->next_run.tv_sec - tv->tv_sec;
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen tv->tv_usec = timeout->next_run.tv_usec - tv->tv_usec;
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen if (tv->tv_sec > 0 || (tv->tv_sec == 0 && tv->tv_usec > 0))
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen /* no need to calculate the times again with this timeout */
ab7b5b9286104974c2a572a499ccf8b56c5d2955Timo Sirainen unsigned int t_id;
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen gettimeofday(&ioloop_timeval, &ioloop_timezone);
ab7b5b9286104974c2a572a499ccf8b56c5d2955Timo Sirainen if (ioloop->timeouts == NULL || !ioloop->timeouts->run_now)
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen for (t = ioloop->timeouts; t != NULL; t = next) {
4ce6338bf945cccfff9e4ce7cc6aa2246851b84aTimo Sirainen io_loop_get_wait_time(t, &tv, &ioloop_timeval);
return ioloop;