From 45ec5b492a1a7f3346da63ed4d4b64f3fbfd9e7e Mon Sep 17 00:00:00 2001 From: sangorrin Date: Tue, 4 Nov 2008 18:29:24 +0000 Subject: [PATCH] add incr timespec git-svn-id: http://www.frescor.org/private/svn/frescor/fosa/trunk@1363 35b4ef3e-fd22-0410-ab77-dab3279adceb --- include/fosa_time_timespec.h | 42 ++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/include/fosa_time_timespec.h b/include/fosa_time_timespec.h index d6de447..77ce73e 100644 --- a/include/fosa_time_timespec.h +++ b/include/fosa_time_timespec.h @@ -61,7 +61,7 @@ // **//// /** ** ////////** /**//////** // ** /** ** /** /** /** // ** /** ** ******** /** /** -// // /******/ //////// // // +// // /******/ //////// // // // // FOSA(Frescor Operating System Adaptation layer) //================================================ @@ -85,7 +85,6 @@ do \ } \ } while(0) - #define add_timespec(sum, t1, t2) \ do { \ (sum).tv_sec = (t1).tv_sec + (t2).tv_sec; \ @@ -93,7 +92,12 @@ do { \ normalize_timespec(sum); \ } while(0) - +#define incr_timespec(t1, t2) \ +do { \ + (t1).tv_sec += (t2).tv_sec; \ + (t1).tv_nsec += (t2).tv_nsec; \ + normalize_timespec(t1); \ +} while(0) // ------------------------------------------------------------------- @@ -111,7 +115,7 @@ do { \ (diff).tv_sec = (base).tv_sec - (interval).tv_sec; \ (diff).tv_nsec = (base).tv_nsec - (interval).tv_nsec; \ } \ -} while(0) +} while(0) // --------------------------------------------------------- @@ -140,7 +144,7 @@ do { \ // --------------------------------------------------------- #define timespec_to_msec(t1) \ - ( ((t1).tv_sec % 2147482) * 1000 + (t1).tv_nsec/1000000 ) + ( ((t1).tv_sec % 2147482) * 1000 + (t1).tv_nsec/1000000 ) // --------------------------------------------------------- @@ -189,7 +193,7 @@ do { \ #define timespec_is_null(t1) ( (t1).tv_sec == 0 ) && ( (t1).tv_nsec == 0 ) - + /***************************************/ /* T I M E S P E C F U N C T I O N S */ /***************************************/ @@ -198,7 +202,7 @@ do { \ static inline fosa_abs_time_t fosa_abs_time_incr(fosa_abs_time_t base, fosa_rel_time_t interval) { fosa_abs_time_t result; - + add_timespec(result, base, interval); return result; @@ -240,7 +244,7 @@ static inline fosa_rel_time_t fosa_rel_time_add(fosa_rel_time_t relt1, fosa_rel_ return result; } - + // --------------------------------------------------------- @@ -259,7 +263,7 @@ static inline fosa_rel_time_t fosa_rel_time_decr(fosa_rel_time_t total, fosa_rel * exact_long_multiply_smaller_10e5() * * Same as below but with operands smaller than 10000 which allows - * to perform all component multiplications without an overflow risk. + * to perform all component multiplications without an overflow risk. **/ static inline struct timespec exact_long_multiply_smaller_10e5(long t, long k) { @@ -302,10 +306,10 @@ static inline struct timespec exact_long_multiply_smaller_10e5(long t, long k) return result; } - -// ------------------------------------------------------------- - +// ------------------------------------------------------------- + + /** * exact_long_multiply() @@ -382,7 +386,7 @@ static inline struct timespec exact_long_multiply(long t, long k) { overflow_risk = true; } - + if (! overflow_risk) { c0.tv_sec = 0; @@ -397,8 +401,8 @@ static inline struct timespec exact_long_multiply(long t, long k) return result; } - -// ------------------------------------------------------------- + +// ------------------------------------------------------------- static inline fosa_rel_time_t fosa_rel_time_times_integer(fosa_rel_time_t time, long multiplier) @@ -412,7 +416,7 @@ static inline fosa_rel_time_t fosa_rel_time_times_integer(fosa_rel_time_t time, intermediate = exact_long_multiply(time.tv_nsec, multiplier); add_timespec(result, result, intermediate); - + return result; } @@ -452,7 +456,7 @@ static inline fosa_rel_time_t fosa_rel_time_divided_by_integer(fosa_rel_time_t t enhacer *= 10; back_enhacer = 1000000000 / enhacer; next_numeral = (time.tv_nsec / back_enhacer) % 10; - + // Note: a possible overflow may happen here with large denominators if (reminder > 200000000) { @@ -460,12 +464,12 @@ static inline fosa_rel_time_t fosa_rel_time_divided_by_integer(fosa_rel_time_t t abort(); } next_dividend = reminder * 10 + next_numeral; - + result.tv_nsec += (next_dividend / divider) * back_enhacer; reminder = next_dividend % divider; } while (back_enhacer > 1); - + return result; } -- 2.39.2