コード例 #1
0
ファイル: ae.c プロジェクト: flygoast/verben
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);
    }
}
コード例 #2
0
ファイル: ae.c プロジェクト: flygoast/verben
/* 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;
}
コード例 #3
0
ファイル: ae.c プロジェクト: imyouxia/Firewallaudit
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;
}