#include #include "../headers/glut_timers.h" #include static int is_updating_time=0; static timer_list_entry *timers_first = NULL; static timer_list_entry *timers_last = NULL; static timer_list_entry *unissued_timers_first = NULL; static timer_list_entry *unissued_timers_last = NULL; /*CODE duplication*/ void timers_add_to_unissued(timer_list_entry *toAdd){ //printf("timers add to unissued begin\n"); if(unissued_timers_last != NULL){ unissued_timers_last->next = toAdd; } else{ if(NULL == unissued_timers_first){ unissued_timers_first=toAdd; } } unissued_timers_last = toAdd; //printf("timers add to unissued end\n"); } void timers_add(timer_list_entry *toAdd){ //printf("timers add begin\n"); if(is_updating_time){ timers_add_to_unissued( toAdd); return; } if(timers_last != NULL){ timers_last->next = toAdd; } else{ if(NULL == timers_first){ timers_first=toAdd; } } timers_last = toAdd; //printf("timers add end\n"); } /** FULL OF PRINT STATEMENTS DUE TO A BUG MYSTERIOUSLY FIXED, see decrease_timers() */ /* unsafe, not checking the validity of the previous, toRemove precondition */ void timers_remove( timer_list_entry *previous, timer_list_entry *toRemove ){ /* printf("timers remove\n"); printf("timers remove previous is %p\n", (void*) previous); printf("timers remove toRemove is %p\n", (void*) toRemove); if(NULL != previous){ printf("timers remove previous->next is %p\n", (void*) previous->next); if(previous->next != toRemove){ printf("timers remove previous->next is not the same as toRemove\n"); } } else{ printf("previous counts as NULL\n"); } if(toRemove->next == NULL){ printf("timers remove toRemove->next is NULL\n"); } else{ printf("timers remove toRemove->next is %p\n", (void*) toRemove->next); } */ if( toRemove == timers_first){ // printf("timers remove toremove is the first\n"); timers_first = timers_first->next; if(NULL == timers_first){ timers_last = NULL; } } else{ // printf("timers remove toremove is not the first\n"); previous->next = toRemove->next; /* could move elsewhere, timer_last is an auxiliary variable */ if( NULL == previous->next){ timers_last = previous; } // printf("timers remove previous->next is now %p\n", (void*) previous->next); } /* i added this and now works. should not need it, smells like bigger bug */ toRemove->next = NULL; // printf("timers remove end\n"); } void append_unissued_timers(){ if( NULL == unissued_timers_first){ return; } timers_add(unissued_timers_first); timers_last=unissued_timers_last; unissued_timers_first = NULL; unissued_timers_last = NULL; } /** FULL OF PRINT STATEMENTS DUE TO A BUG MYSTERIOUSLY FIXED */ void decrease_timers(){ timer_list_entry *current, *previous; previous = NULL; int count = 0; /*DEBUG ONLY*/ current = timers_first; is_updating_time=1; //printf("decrease timers begin\n"); while( current != NULL){ /* printf("decreasing timer\n"); printf("timer addr would be %p\n", (void*) current); */ current->remaining_ms--; //printf("decreased timer\n"); if( 0 >= current->remaining_ms){ //printf("will crash on removal?\n"); timers_remove( previous, current); //printf("removed timer\nbreak on callback?\n"); current->callback(0); /*should receive an int (i guess the runover time)*/ //printf("callback done\nbreak on free?\n"); free( current); //printf("was not the free\n"); /* would make a removal from head inconsistent */ if(previous != NULL){ //printf("previous is not null during the looping, sliding\n"); current=previous; } } /* printf("updating cursors\n"); printf("previous is %p\n", (void*) previous); printf("current is %p\n", (void*) current); */ previous = current; current = current->next; /* printf("updated cursors\n"); printf("previous is %p\n", (void*) previous); printf("current is %p\n", (void*) current); */ count++; // printf("wasn't even the counter\n"); } // printf("out of the timers loop\n"); /* printf("processed %d timers\n", count); */ is_updating_time=0; append_unissued_timers(); // printf("reached the end of decrease timers\n"); } int timers_isEmpty(){ return ( NULL == timers_first); /*could also check timer_last but it is an auxiliary variable */ }