From 1bc06c7e8577ccc9f634fba9bcc90648a8dec9f3 Mon Sep 17 00:00:00 2001 From: Madelyn Olson Date: Thu, 14 May 2020 08:37:24 -0700 Subject: [PATCH] Added a refcount on timer events to prevent deletion of recursive timer calls --- src/ae.c | 10 ++++++++++ src/ae.h | 2 ++ 2 files changed, 12 insertions(+) diff --git a/src/ae.c b/src/ae.c index 379cfd1e6..689a27d16 100644 --- a/src/ae.c +++ b/src/ae.c @@ -238,6 +238,7 @@ long long aeCreateTimeEvent(aeEventLoop *eventLoop, long long milliseconds, te->clientData = clientData; te->prev = NULL; te->next = eventLoop->timeEventHead; + te->refcount = 0; if (te->next) te->next->prev = te; eventLoop->timeEventHead = te; @@ -316,6 +317,13 @@ static int processTimeEvents(aeEventLoop *eventLoop) { /* Remove events scheduled for deletion. */ if (te->id == AE_DELETED_EVENT_ID) { aeTimeEvent *next = te->next; + /* If a reference exists for this timer event, + * don't free it. This is currently incremented + * for recursive timerProc calls */ + if (te->refcount) { + te = next; + continue; + } if (te->prev) te->prev->next = te->next; else @@ -345,7 +353,9 @@ static int processTimeEvents(aeEventLoop *eventLoop) { int retval; id = te->id; + te->refcount++; retval = te->timeProc(eventLoop, id, te->clientData); + te->refcount--; processed++; if (retval != AE_NOMORE) { aeAddMillisecondsToNow(retval,&te->when_sec,&te->when_ms); diff --git a/src/ae.h b/src/ae.h index 63b306615..d1b7f34bf 100644 --- a/src/ae.h +++ b/src/ae.h @@ -86,6 +86,8 @@ typedef struct aeTimeEvent { void *clientData; struct aeTimeEvent *prev; struct aeTimeEvent *next; + int refcount; /* refcount to prevent timer events from being + * freed in recursive time event calls. */ } aeTimeEvent; /* A fired event */