Apply patch from Scott Lamb preventing an infinite loop when sending SIGALRM.
This commit is contained in:
parent
16c8b0e5bb
commit
6c6535a416
3 changed files with 24 additions and 6 deletions
22
src/event.c
22
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();
|
||||
|
|
|
@ -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 *);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue