X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fmisc.c;h=944458f5669d0bd63d486123b3978d773c5aa8cc;hp=28d04a6d1b3844eb59994f17142859aa4905a3ff;hb=c4baa69cc8d5e8398425e67498b49f4b77f8e477;hpb=1256664ceac31f448a0139edd3bd0dc8fa5a8697 diff --git a/src/misc.c b/src/misc.c index 28d04a6d..944458f5 100644 --- a/src/misc.c +++ b/src/misc.c @@ -24,19 +24,45 @@ #include #include -void microsleep(unsigned long usec) +static unsigned long mainCounter(int mode) { - if (usec < 5000) + static struct timeval base_time = { 0, 0 }; + struct timeval current_time; + unsigned long counter_ms; + + gettimeofday(¤t_time, NULL); + + if (mode == INIT_COUNTER || current_time.tv_sec < base_time.tv_sec) + base_time = current_time; + + counter_ms = (current_time.tv_sec - base_time.tv_sec) * 1000 + + (current_time.tv_usec - base_time.tv_usec) / 1000; + + return counter_ms; /* return milliseconds since last init */ +} + +void InitCounter() /* set counter back to zero */ +{ + mainCounter(INIT_COUNTER); +} + +unsigned long Counter() /* get milliseconds since last call of InitCounter() */ +{ + return(mainCounter(READ_COUNTER)); +} + +static void sleep_milliseconds(unsigned long milliseconds_delay) +{ + if (milliseconds_delay < 5 || !cpu_friendly) { /* we want to wait less than 5 ms -- if we assume that we have a kernel timer resolution of 10 ms, we would wait far to long; therefore it's better to do a short interval of busy waiting to get our sleeping time more accurate */ - long base_counter = Counter(), actual_counter = Counter(); - long delay = usec/1000; + unsigned long base_counter = Counter(), actual_counter = Counter(); - while (actual_counter < base_counter+delay && + while (actual_counter < base_counter + milliseconds_delay && actual_counter >= base_counter) actual_counter = Counter(); } @@ -44,79 +70,52 @@ void microsleep(unsigned long usec) { struct timeval delay; - delay.tv_sec = usec / 1000000; - delay.tv_usec = usec % 1000000; + delay.tv_sec = milliseconds_delay / 1000; + delay.tv_usec = 1000 * (milliseconds_delay % 1000); - if (select(0,NULL,NULL,NULL,&delay) != 0) - fprintf(stderr,"%s: in function microsleep: select failed!\n", + if (select(0, NULL, NULL, NULL, &delay) != 0) + fprintf(stderr,"%s: in function sleep_milliseconds: select() failed!\n", progname); } } -long mainCounter(int mode) +void Delay(unsigned long delay) /* Sleep specified number of milliseconds */ { - static struct timeval base_time = { 0, 0 }; - struct timeval current_time; - long counter_ms; - - gettimeofday(¤t_time,NULL); - if (mode == INIT_COUNTER || current_time.tv_sec < base_time.tv_sec) - base_time = current_time; - - counter_ms = (current_time.tv_sec - base_time.tv_sec)*1000 - + (current_time.tv_usec - base_time.tv_usec)/1000; - - return counter_ms; /* return milliseconds since last init */ -} - -void InitCounter() /* set counter back to zero */ -{ - mainCounter(INIT_COUNTER); -} - -long Counter() /* get milliseconds since last call of InitCounter() */ -{ - return(mainCounter(READ_COUNTER)); + sleep_milliseconds(delay); } -void WaitCounter(long value) /* wait for counter to reach value */ +BOOL FrameReached(unsigned long *frame_counter_var, unsigned long frame_delay) { - long wait; + unsigned long actual_frame_counter = FrameCounter; - while((wait=value-Counter())>0) - microsleep(wait * 1000); -} + if (actual_frame_counter < *frame_counter_var+frame_delay && + actual_frame_counter >= *frame_counter_var) + return(FALSE); -void Delay(long value) /* Delay 'value' milliseconds */ -{ - microsleep(value * 1000); + *frame_counter_var = actual_frame_counter; + return(TRUE); } -BOOL DelayReached(long *counter_var, int delay) +BOOL DelayReached(unsigned long *counter_var, unsigned long delay) { - long actual_counter = Counter(); + unsigned long actual_counter = Counter(); - if (actual_counter >= *counter_var+delay || actual_counter < *counter_var) - { - *counter_var = actual_counter; - return(TRUE); - } - else + if (actual_counter < *counter_var + delay && + actual_counter >= *counter_var) return(FALSE); + + *counter_var = actual_counter; + return(TRUE); } -BOOL FrameReached(long *frame_counter_var, int frame_delay) +void WaitUntilDelayReached(unsigned long *counter_var, unsigned long delay) { - long actual_frame_counter = FrameCounter; + unsigned long actual_counter = Counter(); - if (actual_frame_counter >= *frame_counter_var+frame_delay || - actual_frame_counter < *frame_counter_var) - { - *frame_counter_var = actual_frame_counter; - return(TRUE); - } - else - return(FALSE); + if (actual_counter < *counter_var + delay && actual_counter >= *counter_var) + sleep_milliseconds(*counter_var + delay - actual_counter); + + *counter_var = actual_counter; } char *int2str(int ct, int nr)