Added a refcount on timer events to prevent deletion of recursive timer calls

This commit is contained in:
Madelyn Olson 2020-05-14 08:37:24 -07:00
parent c38fd1f661
commit 41cabca2ab
2 changed files with 12 additions and 0 deletions

View File

@ -238,6 +238,7 @@ long long aeCreateTimeEvent(aeEventLoop *eventLoop, long long milliseconds,
te->clientData = clientData; te->clientData = clientData;
te->prev = NULL; te->prev = NULL;
te->next = eventLoop->timeEventHead; te->next = eventLoop->timeEventHead;
te->refcount = 0;
if (te->next) if (te->next)
te->next->prev = te; te->next->prev = te;
eventLoop->timeEventHead = te; eventLoop->timeEventHead = te;
@ -316,6 +317,13 @@ static int processTimeEvents(aeEventLoop *eventLoop) {
/* Remove events scheduled for deletion. */ /* Remove events scheduled for deletion. */
if (te->id == AE_DELETED_EVENT_ID) { if (te->id == AE_DELETED_EVENT_ID) {
aeTimeEvent *next = te->next; 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) if (te->prev)
te->prev->next = te->next; te->prev->next = te->next;
else else
@ -345,7 +353,9 @@ static int processTimeEvents(aeEventLoop *eventLoop) {
int retval; int retval;
id = te->id; id = te->id;
te->refcount++;
retval = te->timeProc(eventLoop, id, te->clientData); retval = te->timeProc(eventLoop, id, te->clientData);
te->refcount--;
processed++; processed++;
if (retval != AE_NOMORE) { if (retval != AE_NOMORE) {
aeAddMillisecondsToNow(retval,&te->when_sec,&te->when_ms); aeAddMillisecondsToNow(retval,&te->when_sec,&te->when_ms);

View File

@ -86,6 +86,8 @@ typedef struct aeTimeEvent {
void *clientData; void *clientData;
struct aeTimeEvent *prev; struct aeTimeEvent *prev;
struct aeTimeEvent *next; struct aeTimeEvent *next;
int refcount; /* refcount to prevent timer events from being
* freed in recursive time event calls. */
} aeTimeEvent; } aeTimeEvent;
/* A fired event */ /* A fired event */