static void timer_handler(void *data) { qltimer_t *timer; lua_State *state; timer = (qltimer_t*)data; state = timer->state; /* actor just sleep? */ if (qstring_empty(timer->mod)) { qdict_del_num(timer->actor->timers, timer->id); lua_resume(state, 0); return; } lua_getglobal(state, timer->mod); if (!lua_istable(state, -1)) { qerror("mod %s is not exist", timer->mod); qtimer_del(timer->engine, timer->id); return; } lua_getfield(state, -1, timer->func); if (!lua_isfunction(state, -1)) { qerror("%s.%s is not lua function", timer->mod, timer->func); qtimer_del(timer->engine, timer->id); return; } lua_pcall(state, 0, LUA_MULTRET, 0); }
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_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); } } }
static void engine_free_timer(void *data) { qltimer_t *timer; timer = (qltimer_t*)data; qtimer_del(timer->engine, timer->id); }
static int qltimer_del(lua_State *state) { qid_t id; qengine_t *engine; qactor_t *actor; id = (qid_t)lua_tonumber(state, 1); if (id == QINVALID_ID) { lua_pushnil(state); lua_pushliteral(state, "wrong param"); return 2; } actor = qlua_get_actor(state); engine = qactor_get_engine(actor->aid); if (qdict_get_num(actor->timers, id) == NULL) { return 0; } qdict_del_num(actor->timers, id); qtimer_del(engine, id); return 0; }