Browse Source

Apply patch from Scott Lamb preventing an infinite loop when sending SIGALRM.

Guus Sliepen 17 years ago
parent
commit
6c6535a416
3 changed files with 24 additions and 6 deletions
  1. 22 0
      src/event.c
  2. 1 0
      src/event.h
  3. 1 6
      src/net.c

+ 22 - 0
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();

+ 1 - 0
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 *);

+ 1 - 6
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;
 		}