diff options
Diffstat (limited to 'libglusterfs/src/timespec.c')
-rw-r--r-- | libglusterfs/src/timespec.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/libglusterfs/src/timespec.c b/libglusterfs/src/timespec.c index 903303d1380..932a18c0103 100644 --- a/libglusterfs/src/timespec.c +++ b/libglusterfs/src/timespec.c @@ -12,6 +12,7 @@ #include <inttypes.h> #include <time.h> #include <sys/time.h> +#include <string.h> #if defined GF_DARWIN_HOST_OS #include <mach/mach_time.h> @@ -21,17 +22,30 @@ static mach_timebase_info_data_t gf_timebase; #include "logging.h" #include "timespec.h" #include "libglusterfs-messages.h" +#include "common-utils.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)) + if (0 == clock_gettime(CLOCK_MONOTONIC, ts)) { + /* All good */ return; - else { - struct timeval tv; - if (0 == gettimeofday(&tv, NULL)) - TIMEVAL_TO_TIMESPEC(&tv, ts); } + + /* Fall back, but there is hope in gettimeofday() syscall */ + struct timeval tv; + if (0 == gettimeofday(&tv, NULL)) { + /* Again, all good */ + TIMEVAL_TO_TIMESPEC(&tv, ts); + return; + } + + /* If control hits here, there is surely a problem, + mainly because, as per man page too, these syscalls + shouldn't fail. Best way is to ABORT, because it is + not right */ + GF_ABORT ("gettimeofday() failed!!"); + #elif defined GF_DARWIN_HOST_OS uint64_t time = mach_absolute_time(); static double scaling = 0.0; |