TIMR_ENT *dtq_add_entry(int queue_id, int time, void (*user_routine)(), dim_long tag) { TIMR_ENT *new_entry, *queue_head, *auxp, *prevp; int next_time, min_time = 100000; int time_left, deltat = 0; DISABLE_AST next_time = time; if(!next_time) next_time = -10; if(Alarm_runs) { time_left = DIM_time_left; if(!time_left) time_left = DIM_next_time; if((time_left > next_time) || (queue_id == SPECIAL_QUEUE)) { if(next_time != -10) { min_time = stop_it(); if((next_time > min_time) && (min_time != 0)) next_time = min_time; } else my_alarm(next_time); } else { deltat = get_elapsed_time(); } } new_entry = (TIMR_ENT *)malloc( sizeof(TIMR_ENT) ); new_entry->time = time; if( user_routine ) new_entry->user_routine = user_routine; else new_entry->user_routine = Std_timer_handler; new_entry->tag = tag; new_entry->time_left = time + deltat; queue_head = timer_queues[queue_id].queue_head; if(!time) { dll_insert_after((DLL *)queue_head->prev, (DLL *)new_entry); } else { if(queue_head) { auxp = queue_head; prevp = auxp; while((auxp = (TIMR_ENT *)dll_get_prev((DLL *)queue_head, (DLL *)auxp))) { if(time >= auxp->time) { break; } prevp = auxp; } /* if(auxp) { if(queue_id != SPECIAL_QUEUE) { if(auxp->time_left > 0) { if(auxp->time == time) new_entry->time_left = auxp->time_left; } } prevp = auxp; } */ dll_insert_after((DLL *)prevp, (DLL *)new_entry); } } if(!Alarm_runs) { if((next_time != -10) && (min_time == 100000)) { min_time = get_minimum(0); if(next_time > min_time) next_time = min_time; } start_it(next_time); } ENABLE_AST return(new_entry); }
int main() { chk_msg("dll_init"); dll_t list; dll_init(&list); chk_dll_size(&list, 0); chk_msg("dll_push_back"); dll_push_back(&list); chk_dll_size(&list, 1); chk_msg("dll_push_front"); dll_push_front(&list); chk_dll_size(&list, 2); chk_msg("dll_destroy"); dll_destroy(&list); chk_dll_size(&list, 0); chk_msg("dll_push_front"); dll_push_front(&list); chk_dll_size(&list, 1); chk_msg("dll_pop_back"); dll_pop_back(&list); chk_dll_size(&list, 0); chk_msg("dll_destroy"); dll_destroy(&list); chk_dll_size(&list, 0); chk_msg("dll_destroy"); dll_destroy(&list); chk_dll_size(&list, 0); chk_msg("dll_push_back"); dll_item_t *item = dll_push_back(&list); chk_dll_size(&list, 1); chk_msg("dll_insert_before"); item = dll_insert_before(&list, item); chk_dll_size(&list, 2); chk_msg("dll_insert_after"); item = dll_insert_after(&list, item); chk_dll_size(&list, 3); #if TRIGGER_INV_BUG chk_msg("dll_remove"); dll_remove(&list, dll_next(dll_prev(dll_prev(dll_end(&list))))); chk_dll_size(&list, 2); #endif chk_msg("dll_pop_front"); dll_pop_front(&list); chk_dll_size(&list, 1); #if TRIGGER_INV_BUG chk_msg("dll_remove"); dll_remove(&list, dll_beg(&list)); chk_dll_size(&list, 0); #endif ___sl_plot(NULL); return 0; }