From: Guus Sliepen Date: Wed, 14 Feb 2007 09:20:20 +0000 (+0000) Subject: Apply patch from Scott Lamb preventing an infinite loop when sending SIGALRM. X-Git-Tag: release-1.0.8~7 X-Git-Url: https://git.tinc-vpn.org/git/browse?a=commitdiff_plain;h=6c6535a4161d04accb3a22c51477e9f92ae34086;p=tinc Apply patch from Scott Lamb preventing an infinite loop when sending SIGALRM. --- diff --git a/src/event.c b/src/event.c index e7fbb882..c791205f 100644 --- a/src/event.c +++ b/src/event.c @@ -57,6 +57,28 @@ void exit_events(void) avl_delete_tree(event_tree); } +void flush_events(void) +{ + avl_tree_t *to_flush; + event_t *event; + + /* + * Events can be inserted from event handlers, so only flush events + * already in the priority queue. + */ + + 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); + } + avl_delete_tree(to_flush); +} + event_t *new_event(void) { cp(); diff --git a/src/event.h b/src/event.h index 275bed52..50e5b972 100644 --- a/src/event.h +++ b/src/event.h @@ -38,6 +38,7 @@ typedef struct { extern void init_events(void); extern void exit_events(void); +extern void flush_events(void); extern event_t *new_event(void) __attribute__ ((__malloc__)); extern void free_event(event_t *); extern void event_add(event_t *); diff --git a/src/net.c b/src/net.c index 31f1b0e4..f6b14704 100644 --- a/src/net.c +++ b/src/net.c @@ -429,12 +429,7 @@ int main_loop(void) if(sigalrm) { logger(LOG_INFO, _("Flushing event queue")); - - while(event_tree->head) { - event = event_tree->head->data; - event->handler(event->data); - event_del(event); - } + flush_events(); sigalrm = false; }