diff options
author | Salvatore Sanfilippo <antirez@gmail.com> | 2020-05-14 18:10:57 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-14 18:10:57 +0200 |
commit | 0dea1142da479f6b9dfaeba410fd279c6f12da68 (patch) | |
tree | 3b636ce4039c68c5b8a5088acd3ebe0deaa193d4 | |
parent | c38fd1f66152109a2d2801b1d181cdc1901d6b3b (diff) | |
parent | 41cabca2ab4478c3288d0d97419f4412785652bc (diff) | |
download | redis-0dea1142da479f6b9dfaeba410fd279c6f12da68.tar.gz |
Merge pull request #7253 from madolson/unstable-ae-recursion
Added a refcount on timer events to prevent deletion of recursive timer events
-rw-r--r-- | src/ae.c | 10 | ||||
-rw-r--r-- | src/ae.h | 2 |
2 files changed, 12 insertions, 0 deletions
@@ -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); @@ -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 */ |