X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Fltt%2Ftime.h;h=d904953099c96da1888fd1aa826966736eb91e84;hb=0aa6c3a15541d012d2ab10034090490fc2a2d1ca;hp=61c3e596c3e0bb2ca76707fa12b738be27471ab2;hpb=18206708bafbba3198bfb82cca97f17d70a05666;p=lttv.git diff --git a/ltt/branches/poly/ltt/time.h b/ltt/branches/poly/ltt/time.h index 61c3e596..d9049530 100644 --- a/ltt/branches/poly/ltt/time.h +++ b/ltt/branches/poly/ltt/time.h @@ -28,13 +28,13 @@ typedef struct _LttTime { } LttTime; -static const unsigned long NANOSECONDS_PER_SECOND = 1000000000; +#define NANOSECONDS_PER_SECOND 1000000000 -static const LttTime ltt_time_zero = { 0, 0}; +static const LttTime ltt_time_zero = { 0, 0 }; static const LttTime ltt_time_one = { 0, 1 }; -static const LttTime ltt_time_infinite = { G_MAXUINT, G_MAXUINT }; +static const LttTime ltt_time_infinite = { G_MAXUINT, NANOSECONDS_PER_SECOND }; static inline LttTime ltt_time_sub(LttTime t1, LttTime t2) { @@ -110,15 +110,40 @@ static inline int ltt_time_compare(LttTime t1, LttTime t2) return 0; } +#define LTT_TIME_MIN(a,b) ((ltt_time_compare((a),(b)) < 0) ? (a) : (b)) +#define LTT_TIME_MAX(a,b) ((ltt_time_compare((a),(b)) > 0) ? (a) : (b)) +#define MAX_TV_SEC_TO_DOUBLE 0x7FFFFF static inline double ltt_time_to_double(LttTime t1) { + /* We lose precision if tv_sec is > than (2^23)-1 + * + * Max values that fits in a double (53 bits precision on normalised + * mantissa): + * tv_nsec : NANOSECONDS_PER_SECONDS : 2^30 + * + * So we have 53-30 = 23 bits left for tv_sec. + * */ + g_assert(t1.tv_sec <= MAX_TV_SEC_TO_DOUBLE); + if(t1.tv_sec > MAX_TV_SEC_TO_DOUBLE) + g_warning("Precision loss in conversion LttTime to double"); return (double)t1.tv_sec + (double)t1.tv_nsec / NANOSECONDS_PER_SECOND; } static inline LttTime ltt_time_from_double(double t1) { + /* We lose precision if tv_sec is > than (2^23)-1 + * + * Max values that fits in a double (53 bits precision on normalised + * mantissa): + * tv_nsec : NANOSECONDS_PER_SECONDS : 2^30 + * + * So we have 53-30 = 23 bits left for tv_sec. + * */ + g_assert(t1 <= MAX_TV_SEC_TO_DOUBLE); + if(t1 > MAX_TV_SEC_TO_DOUBLE) + g_warning("Conversion from non precise double to LttTime"); LttTime res; res.tv_sec = t1; res.tv_nsec = (t1 - res.tv_sec) * NANOSECONDS_PER_SECOND;