From 6c6535a4161d04accb3a22c51477e9f92ae34086 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Wed, 14 Feb 2007 09:20:20 +0000 Subject: [PATCH] Apply patch from Scott Lamb preventing an infinite loop when sending SIGALRM. --- src/event.c | 22 ++++++++++++++++++++++ src/event.h | 1 + src/net.c | 7 +------ 3 files changed, 24 insertions(+), 6 deletions(-) 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; } -- 2.20.1