void qtimer_process(qtimer_manager_t *mng) { uint64_t now; qtimer_t *timer; qrbtree_node_t *node, *root, *sentinel; update_now_time(mng); now = mng->now_ms; sentinel = mng->rbtree.sentinel; while (1) { root = mng->rbtree.root; if (sentinel == root) { return; } node = qrbtree_min(root, sentinel); timer = (qtimer_t *)((char *) node - offsetof(qtimer_t, node)); if (timer->timeout > mng->now_ms) { return; } (timer->handler)(timer->data); if (timer->cycle > 0) { timer->timeout = now + timer->cycle; } else { qtimer_del(mng->engine, timer->id); } } }
void qtimer_process(qtimer_manager_t *mng) { uint64_t now; qtimer_t *timer; if (qminheap_empty(&(mng->min_heap))) { return; } update_now_time(mng); now = mng->now_ms; timer = (qtimer_t*)qminheap_top(&(mng->min_heap)); while (now >= timer->timeout) { (timer->handler)(timer->data); qminheap_pop(&(mng->min_heap)); if (timer->cycle > 0) { timer->timeout = now + timer->cycle; qminheap_push(&(mng->min_heap), timer); } else { qtimer_del(mng->engine, timer->id); } timer = (qtimer_t*)qminheap_top(&(mng->min_heap)); } }
void qtimer_manager_init(qtimer_manager_t *mng, qengine_t *engine) { qfreelist_conf_t conf = QFREELIST_CONF("timer free list", sizeof(qtimer_t), 10, NULL, NULL, NULL); update_now_time(mng); mng->engine = engine; qidmap_init(&(mng->id_map)); qfreelist_init(&mng->free_list, &conf); qrbtree_init(&(mng->rbtree), &(mng->sentinel), qrbtree_insert_timer_value); }
void qtimer_manager_init(qtimer_manager_t *mng, qengine_t *engine) { qfreelist_conf_t conf = QFREELIST_CONF("timer free list", sizeof(qtimer_t), 10, NULL, NULL, NULL); update_now_time(mng); mng->engine = engine; qidmap_init(&(mng->id_map)); qfreelist_init(&mng->free_list, &conf); qminheap_init(&(mng->min_heap), compare_timer, set_timer_heap_index, get_timer_heap_index); }