1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
void static_single_cycle_queue_timer_init(struct timer_node_cycle_queue_struct *timer_node_cycle_queue) { uint32_t i = 0; static_link_list_init(&timer_node_cycle_queue->timer_node_wait_list); for (i = 0; i < TIMER_NODE_COUNT_MAX_LEN; i++) { static_link_list_init(&timer_node_cycle_queue->timer_node_count[i]); } }
void static_single_cycle_queue_timer_run(struct timer_node_cycle_queue_struct *timer_node_cycle_queue) { struct timer_node_struct *timer; do { timer = (struct timer_node_struct *)static_link_get_node(&timer_node_cycle_queue->timer_node_count[timer_node_cycle_queue->timer_node_counter],1); if (timer != 0) { if(timer->is_right_now && timer->call_back != 0) { timer->call_back(timer->param); } timer->is_timeout = 1; static_link_list_delete_node(&timer_node_cycle_queue->timer_node_count[timer_node_cycle_queue->timer_node_counter],1); } }while (timer != 0);
timer_node_cycle_queue->timer_node_counter++; timer_node_cycle_queue->timer_node_counter %= TIMER_NODE_COUNT_MAX_LEN; static uint32_t wait_list_counter = 0; do { timer = (struct timer_node_struct *)static_link_get_node(&timer_node_cycle_queue->timer_node_wait_list,wait_list_counter + 1); if (timer != 0) { timer->wait_tick--; if (timer->wait_tick < TIMER_NODE_COUNT_MAX_LEN) { static_link_list_node_register(&timer_node_cycle_queue->timer_node_count[(timer_node_cycle_queue->timer_node_counter + timer->wait_tick) % TIMER_NODE_COUNT_MAX_LEN],(struct static_link_list_node_struct *)timer); static_link_list_delete_node(&timer_node_cycle_queue->timer_node_wait_list,wait_list_counter + 1); } wait_list_counter++; }else { wait_list_counter = 0; } }while (timer != 0); } void static_single_timer_register(struct timer_node_cycle_queue_struct *timer_node_cycle_queue, { timer->wait_tick = time; timer->is_timeout = 0; timer->is_right_now = is_right_now; timer->param = param; timer->call_back = call_back; if(time / TIMER_NODE_COUNT_MAX_LEN == 0) { static_link_list_node_register(&timer_node_cycle_queue->timer_node_count[time % TIMER_NODE_COUNT_MAX_LEN],(struct static_link_list_node_struct *)timer); }else { static_link_list_node_register(&timer_node_cycle_queue->timer_node_wait_list,(struct static_link_list_node_struct *)timer); } }
|