Optimise handling of select() returning <= 0.
[tinc] / src / net.c
index 59dd39b..f24d18a 100644 (file)
--- a/src/net.c
+++ b/src/net.c
@@ -303,7 +303,7 @@ static void check_network_activity(fd_set * readset, fd_set * writeset) {
                                else {
                                        ifdebug(CONNECTIONS) logger(LOG_DEBUG,
                                                           "Error while connecting to %s (%s): %s",
-                                                          c->name, c->hostname, strerror(result));
+                                                          c->name, c->hostname, sockstrerror(result));
                                        closesocket(c->socket);
                                        do_outgoing_connection(c);
                                        continue;
@@ -369,17 +369,15 @@ int main_loop(void) {
 #endif
 
                if(r < 0) {
-                       if(errno != EINTR && errno != EAGAIN) {
-                               logger(LOG_ERR, "Error while waiting for input: %s",
-                                          strerror(errno));
+                       if(!sockwouldblock(sockerrno)) {
+                               logger(LOG_ERR, "Error while waiting for input: %s", sockstrerror(sockerrno));
                                dump_connections();
                                return 1;
                        }
-
-                       continue;
                }
 
-               check_network_activity(&readset, &writeset);
+               if(r > 0)
+                       check_network_activity(&readset, &writeset);
 
                if(do_purge) {
                        purge();
@@ -419,8 +417,13 @@ int main_loop(void) {
                }
 
                if(sigalrm) {
+                       avl_node_t *node;
                        logger(LOG_INFO, "Flushing event queue");
                        expire_events();
+                       for(node = connection_tree->head; node; node = node->next) {
+                               connection_t *c = node->data;
+                               send_ping(c);
+                       }
                        sigalrm = false;
                }