Use libevent to dump graphs when necessary.
authorGuus Sliepen <guus@tinc-vpn.org>
Thu, 17 May 2007 21:14:30 +0000 (21:14 +0000)
committerGuus Sliepen <guus@tinc-vpn.org>
Thu, 17 May 2007 21:14:30 +0000 (21:14 +0000)
event_add() can be called repeatedly, the second and later calls are ignored if
the event hasn't been removed yet.

src/graph.c
src/net.c

index 1f00660..02650f7 100644 (file)
@@ -58,8 +58,6 @@
 #include "subnet.h"
 #include "utils.h"
 
-static bool graph_changed = true;
-
 /* Implementation of Kruskal's algorithm.
    Running time: O(EN)
    Please note that sorting on weight is already done by add_edge().
@@ -311,22 +309,13 @@ void sssp_bfs(void)
        }
 }
 
-void graph(void)
-{
-       sssp_bfs();
-       mst_kruskal();
-       graph_changed = true;
-}
-
-
-
 /* Dump nodes and edges to a graphviz file.
           
    The file can be converted to an image with
    dot -Tpng graph_filename -o image_filename.png -Gconcentrate=true
 */
 
-void dump_graph(void)
+static void dump_graph(int fd, short events, void *data)
 {
        avl_node_t *node;
        node_t *n;
@@ -334,11 +323,9 @@ void dump_graph(void)
        char *filename = NULL, *tmpname = NULL;
        FILE *file;
        
-       if(!graph_changed || !get_config_string(lookup_config(config_tree, "GraphDumpFile"), &filename))
+       if(!get_config_string(lookup_config(config_tree, "GraphDumpFile"), &filename))
                return;
 
-       graph_changed = false;
-
        ifdebug(PROTOCOL) logger(LOG_NOTICE, "Dumping graph");
        
        if(filename[0] == '|') {
@@ -381,3 +368,15 @@ void dump_graph(void)
                free(tmpname);
        }
 }
+
+void graph(void)
+{
+       static struct event ev;
+
+       sssp_bfs();
+       mst_kruskal();
+
+       if(!ev.ev_callback)
+               timeout_set(&ev, dump_graph, NULL);
+       event_add(&ev, &(struct timeval){5, 0});
+}
index 8259a36..a1ca9ab 100644 (file)
--- a/src/net.c
+++ b/src/net.c
@@ -301,7 +301,7 @@ int main_loop(void)
 {
        struct timeval tv;
        int r;
-       time_t last_ping_check, last_config_check, last_graph_dump;
+       time_t last_ping_check, last_config_check;
        tevent_t *event;
        struct event timeout;
 
@@ -309,7 +309,6 @@ int main_loop(void)
 
        last_ping_check = now;
        last_config_check = now;
-       last_graph_dump = now;
        
        srand(now);
 
@@ -431,13 +430,6 @@ int main_loop(void)
                        
                        try_outgoing_connections();
                }
-               
-               /* Dump graph if wanted every 60 seconds*/
-
-               if(last_graph_dump + 60 < now) {
-                       dump_graph();
-                       last_graph_dump = now;
-               }
        }
 
        return 0;