- cnode *t = main_timer_list.head.next;
- while (t != &main_timer_list.head && ((struct main_timer *) t)->expires < expires)
- t = t->next;
- clist_insert_before(&tm->n, t);
+ if (!tm->expires)
+ {
+ tm->expires = expires;
+ tm->index = ++main_timer_cnt;
+ main_timer_table_grow(&main_timer_table, tm->index + 1);
+ main_timer_table.ptr[tm->index] = tm;
+ HEAP_INSERT(struct main_timer *, main_timer_table.ptr, main_timer_cnt, MAIN_TIMER_LESS, MAIN_TIMER_SWAP);
+ }
+ else
+ {
+ tm->expires = expires;
+ HEAP_INCREASE(struct main_timer *, main_timer_table.ptr, main_timer_cnt, MAIN_TIMER_LESS, MAIN_TIMER_SWAP, tm->index);
+ }
+ }
+ else if (tm->expires > expires)
+ {
+ if (!expires)
+ {
+ ASSERT(tm->index && tm->index <= main_timer_cnt);
+ HEAP_DELETE(struct main_timer *, main_timer_table.ptr, main_timer_cnt, MAIN_TIMER_LESS, MAIN_TIMER_SWAP, tm->index);
+ tm->index = 0;
+ tm->expires = 0;
+ }
+ else
+ {
+ tm->expires = expires;
+ HEAP_DECREASE(struct main_timer *, main_timer_table.ptr, main_timer_cnt, MAIN_TIMER_LESS, MAIN_TIMER_SWAP, tm->index);
+ }