X-Git-Url: https://www.tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fevent.c;h=1283edd332b8334fa8fc78a6faedb03d2a397516;hb=d6b45d005530496e48325a6174ecdd889a17bfc1;hp=9cd7d07ae7246a0554db90c84760bd3445da0cec;hpb=d6c8a1a3d3e945142b251b2897517e10ce0dfce4;p=tinc diff --git a/src/event.c b/src/event.c index 9cd7d07a..1283edd3 100644 --- a/src/event.c +++ b/src/event.c @@ -1,6 +1,6 @@ /* event.c -- I/O, timeout and signal event handling - Copyright (C) 2012-2013 Guus Sliepen + Copyright (C) 2012-2018 Guus Sliepen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -237,6 +237,8 @@ static void signal_handler(int signum) { } static void signalio_handler(void *data, int flags) { + (void)data; + (void)flags; unsigned char signum; if(read(pipefd[0], &signum, 1) != 1) { @@ -348,6 +350,8 @@ bool event_loop(void) { continue; } + unsigned int curgen = io_tree.generation; + for splay_each(io_t, io, &io_tree) { if(FD_ISSET(io->fd, &writable)) { io->cb(io->data, IO_WRITE); @@ -360,10 +364,12 @@ bool event_loop(void) { /* There are scenarios in which the callback will remove another io_t from the tree (e.g. closing a double connection). Since splay_each does not support that, we - need to exit the loop now. That's okay, since any remaining events will get picked - up by the next select() call. + need to exit the loop if that happens. That's okay, since any remaining events will + get picked up by the next select() call. */ - break; + if(curgen != io_tree.generation) { + break; + } } } @@ -372,7 +378,7 @@ bool event_loop(void) { while(running) { struct timeval diff; struct timeval *tv = get_time_remaining(&diff); - DWORD timeout_ms = tv ? (tv->tv_sec * 1000 + tv->tv_usec / 1000 + 1) : WSA_INFINITE; + DWORD timeout_ms = tv ? (DWORD)(tv->tv_sec * 1000 + tv->tv_usec / 1000 + 1) : WSA_INFINITE; if(!event_count) { Sleep(timeout_ms); @@ -429,12 +435,12 @@ bool event_loop(void) { break; } - if(result < WSA_WAIT_EVENT_0 || result >= WSA_WAIT_EVENT_0 + event_count - event_offset) { + if(result >= event_count - event_offset) { return(false); } /* Look up io in the map by index. */ - event_index = result - WSA_WAIT_EVENT_0 + event_offset; + event_index = result - event_offset; io_t *io = io_map[event_index]; if(io->fd == -1) {