summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMadelyn Olson <matolson@amazon.com>2020-05-14 08:37:24 -0700
committerMadelyn Olson <matolson@amazon.com>2020-05-14 08:49:11 -0700
commit41cabca2ab4478c3288d0d97419f4412785652bc (patch)
tree3b636ce4039c68c5b8a5088acd3ebe0deaa193d4
parentc38fd1f66152109a2d2801b1d181cdc1901d6b3b (diff)
downloadredis-41cabca2ab4478c3288d0d97419f4412785652bc.tar.gz
Added a refcount on timer events to prevent deletion of recursive timer calls
-rw-r--r--src/ae.c10
-rw-r--r--src/ae.h2
2 files changed, 12 insertions, 0 deletions
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 */