示例#1
0
文件: qtimer.c 项目: DiaosiDev/qnode
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);
    }
  }
}
示例#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
文件: qtimer.c 项目: DiaosiDev/qnode
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);
}
示例#4
0
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);
}