Added a refcount on timer events to prevent deletion of recursive timer calls
This commit is contained in:
parent
c38fd1f661
commit
41cabca2ab
10
src/ae.c
10
src/ae.c
@ -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);
|
||||||
|
2
src/ae.h
2
src/ae.h
@ -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 */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user