Пример #1
0
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);
}
Пример #2
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));
  }
}
Пример #3
0
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);
    }
  }
}
Пример #4
0
static void
engine_free_timer(void *data) {
  qltimer_t *timer;

  timer = (qltimer_t*)data;
  qtimer_del(timer->engine, timer->id);
}
Пример #5
0
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;
}