From d29a55a8db57a14836fac8ab86bb2ebf1f6fcd7f Mon Sep 17 00:00:00 2001 From: Bram Matthys Date: Sat, 4 Jan 2020 16:54:48 +0100 Subject: [PATCH] Update DoEvents() so it is safe to call EventDel() from within an event handler. Until now it was NOT safe. Now it is. --- src/api-event.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/api-event.c b/src/api-event.c index 65b327b58..997b8bd1d 100644 --- a/src/api-event.c +++ b/src/api-event.c @@ -155,24 +155,25 @@ int EventMod(Event *event, EventInfo *mods) void DoEvents(void) { - Event *eventptr; - Event temp; + Event *e, *e_next; - for (eventptr = events; eventptr; eventptr = eventptr->next) + for (e = events; e; e = e_next) { - if (eventptr->count == -1) - goto freeit; - if ((eventptr->every_msec == 0) || minimum_msec_since_last_run(&eventptr->last_run, eventptr->every_msec)) + e_next = e->next; + if (e->count == -1) { - (*eventptr->event)(eventptr->data); - if (eventptr->count > 0) + EventDel(e); + continue; + } + if ((e->every_msec == 0) || minimum_msec_since_last_run(&e->last_run, e->every_msec)) + { + (*e->event)(e->data); + if (e->count > 0) { - eventptr->count--; - if (eventptr->count == 0) + e->count--; + if (e->count == 0) { -freeit: - temp.next = EventDel(eventptr); - eventptr = &temp; + EventDel(e); continue; } }