void delete_all(ae_event_loop *el) { int i = 0; for ( ; ; ++i) { if (!acq_items[i].item_name) { break; } ae_delete_time_event(el, acq_items[i].event_id); } }
/* Process time events. */ static int process_time_events(ae_event_loop *el) { int processed = 0; ae_time_event *te; long long maxid; te = el->time_event_head; maxid = el->time_event_next_id - 1; while (te) { long now_sec, now_ms; long long id; /* Don't process the time event registered during this process. */ if (te->id > maxid) { te = te->next; continue; } ae_get_time(&now_sec, &now_ms); /* timeout */ if (now_sec > te->when_sec || (now_sec == te->when_sec && now_ms >= te->when_ms)) { int ret; id = te->id; ret = te->time_proc(el, id, te->client_data); processed++; /* After an event is processed our time event list may no longer be the same, so we restart from head. Still we make sure to don't process events registered by event handlers itself in order to don't loop forever. To do so we saved the max ID we want to handle. FUTURE OPTIMIZATIONS: Note that this is NOT great algorithmically. Redis uses a single time event so it's not a problem but the right way to do this is to add the new elements on head, and to flag deleted elements in a special way for later deletion(putting references to the nodes to delete into another linked list). */ if (ret > 0) { ae_add_milliseconds_to_now(ret, &te->when_sec, &te->when_ms); } else { ae_delete_time_event(el, id); } te = el->time_event_head; } else { te = te->next; } } return processed; }
static int process_time_event(ae_event_loop * ev_loop) { int processed = 0; ae_time_event * te; long long maxid; time_t now = time(NULL); if (now < ev_loop->last_time) { te = ev_loop->time_event_head; while (te) { te->when_sec = 0; te = te->next; } } ev_loop->last_time = now; te = ev_loop->time_event_head; maxid = ev_loop->time_event_next_id - 1; while (te) { long now_sec, now_ms; long long id; if (te->id > maxid) { te = te->next; continue; } ae_get_time(&now_sec, &now_ms); if (now_sec > te->when_sec || (now_sec == te->when_sec && now_ms >= te->when_ms)) { int retval; id = te->id; retval = te->time_func(ev_loop, id, te->client_data); processed++; if (retval != AE_NOMORE) ae_add_milliseconds_to_now(retval, &te->when_sec, &te->when_ms); else ae_delete_time_event(ev_loop, id); te = ev_loop->time_event_head; } else { te = te->next; } } return processed; }