diff options
Diffstat (limited to 'libglusterfs/src/timespec.c')
-rw-r--r-- | libglusterfs/src/timespec.c | 41 |
1 files changed, 19 insertions, 22 deletions
diff --git a/libglusterfs/src/timespec.c b/libglusterfs/src/timespec.c index a0c281a1efb..5242ecc8cd0 100644 --- a/libglusterfs/src/timespec.c +++ b/libglusterfs/src/timespec.c @@ -10,54 +10,51 @@ #include <stdio.h> #include <inttypes.h> -#if defined GF_LINUX_HOST_OS || defined GF_SOLARIS_HOST_OS || defined GF_BSD_HOST_OS #include <time.h> #include <sys/time.h> -#endif #if defined GF_DARWIN_HOST_OS #include <mach/mach_time.h> +static mach_timebase_info_data_t gf_timebase; #endif #include "logging.h" -#include "time.h" - - -void tv2ts (struct timeval tv, struct timespec *ts) -{ - ts->tv_sec = tv.tv_sec; - ts->tv_nsec = tv.tv_usec * 1000; -} +#include "timespec.h" void timespec_now (struct timespec *ts) { #if defined GF_LINUX_HOST_OS || defined GF_SOLARIS_HOST_OS || defined GF_BSD_HOST_OS - if (0 == clock_gettime(CLOCK_MONOTONIC, ts)) return; else { struct timeval tv; if (0 == gettimeofday(&tv, NULL)) - tv2ts(tv, ts); + TIMEVAL_TO_TIMESPEC(&tv, ts); } #elif defined GF_DARWIN_HOST_OS - mach_timebase_info_data_t tb = { 0 }; - static double timebase = 0.0; - uint64_t time = 0; - mach_timebase_info (&tb); + uint64_t time = mach_absolute_time(); + static double scaling = 0.0; - timebase *= info.numer; - timebase /= info.denom; + if (mach_timebase_info(&gf_timebase) != KERN_SUCCESS) { + gf_timebase.numer = 1; + gf_timebase.denom = 1; + } + if (gf_timebase.denom == 0) { + gf_timebase.numer = 1; + gf_timebase.denom = 1; + } - time = mach_absolute_time(); - time *= timebase; + scaling = (double) gf_timebase.numer / (double) gf_timebase.denom; + time *= scaling; ts->tv_sec = (time * NANO); - ts->tv_nsec = (time - (ts.tv_sec * GIGA)); + ts->tv_nsec = (time - (ts->tv_sec * GIGA)); #endif /* Platform verification */ - gf_log_callingfn ("timer", GF_LOG_DEBUG, "%"PRIu64".%09"PRIu64, + /* + gf_log_callingfn ("timer", GF_LOG_TRACE, "%"GF_PRI_TIME".%09"GF_PRI_TIME, ts->tv_sec, ts->tv_nsec); + */ } void timespec_adjust_delta (struct timespec *ts, struct timespec delta) |