X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fevent.c;fp=src%2Fevent.c;h=5df052772dbf4d691bad0b7d61b38f7681314d40;hp=8a63e12d39fa4d598f8daef9b51016e3d87a9466;hb=116065afe352221ac6c2c8e34c109252004d6a59;hpb=a39a9506cd041a7092a98498b362eaacfd2f33c3 diff --git a/src/event.c b/src/event.c index 8a63e12d..5df05277 100644 --- a/src/event.c +++ b/src/event.c @@ -47,7 +47,7 @@ void init_events(void) { cp(); - event_tree = avl_alloc_tree((avl_compare_t) event_compare, NULL); + event_tree = avl_alloc_tree((avl_compare_t) event_compare, (avl_action_t) free_event); } void exit_events(void) @@ -57,26 +57,32 @@ void exit_events(void) avl_delete_tree(event_tree); } -void flush_events(void) +void expire_events(void) { - avl_tree_t *to_flush; + avl_node_t *node; event_t *event; + time_t diff; /* - * Events can be inserted from event handlers, so only flush events - * already in the priority queue. + * Make all events appear expired by substracting the difference between + * the expiration time of the last event and the current time. */ cp(); - to_flush = event_tree; - init_events(); - while (to_flush->head) { - event = to_flush->head->data; - event->handler(event->data); - avl_delete(to_flush, event); + if(!event_tree->tail) + return; + + event = event_tree->tail->data; + if(event->time < now) + return; + + diff = 1 + event->time - now; + + for(node = event_tree->head; node; node = node->next) { + event = node->data; + event->time -= diff; } - avl_delete_tree(to_flush); } event_t *new_event(void) @@ -118,7 +124,7 @@ event_t *get_expired_event(void) event = event_tree->head->data; if(event->time < now) { - event_del(event); + avl_unlink_node(event_tree, event_tree->head); return event; } }