diff --git a/src/ae.c b/src/ae.c index 6ed366fe..65adb2ab 100644 --- a/src/ae.c +++ b/src/ae.c @@ -219,7 +219,10 @@ long long aeCreateTimeEvent(aeEventLoop *eventLoop, long long milliseconds, te->timeProc = proc; te->finalizerProc = finalizerProc; te->clientData = clientData; + te->prev = NULL; te->next = eventLoop->timeEventHead; + if (te->next) + te->next->prev = te; eventLoop->timeEventHead = te; return id; } @@ -266,7 +269,7 @@ static aeTimeEvent *aeSearchNearestTimer(aeEventLoop *eventLoop) /* Process time events */ static int processTimeEvents(aeEventLoop *eventLoop) { int processed = 0; - aeTimeEvent *te, *prev; + aeTimeEvent *te; long long maxId; time_t now = time(NULL); @@ -287,7 +290,6 @@ static int processTimeEvents(aeEventLoop *eventLoop) { } eventLoop->lastTime = now; - prev = NULL; te = eventLoop->timeEventHead; maxId = eventLoop->timeEventNextId-1; while(te) { @@ -297,10 +299,12 @@ static int processTimeEvents(aeEventLoop *eventLoop) { /* Remove events scheduled for deletion. */ if (te->id == AE_DELETED_EVENT_ID) { aeTimeEvent *next = te->next; - if (prev == NULL) - eventLoop->timeEventHead = te->next; + if (te->prev) + te->prev->next = te->next; else - prev->next = te->next; + eventLoop->timeEventHead = te->next; + if (te->next) + te->next->prev = te->prev; if (te->finalizerProc) te->finalizerProc(eventLoop, te->clientData); zfree(te); @@ -332,7 +336,6 @@ static int processTimeEvents(aeEventLoop *eventLoop) { te->id = AE_DELETED_EVENT_ID; } } - prev = te; te = te->next; } return processed; diff --git a/src/ae.h b/src/ae.h index df517483..184fe3d1 100644 --- a/src/ae.h +++ b/src/ae.h @@ -83,6 +83,7 @@ typedef struct aeTimeEvent { aeTimeProc *timeProc; aeEventFinalizerProc *finalizerProc; void *clientData; + struct aeTimeEvent *prev; struct aeTimeEvent *next; } aeTimeEvent;