summaryrefslogtreecommitdiff
path: root/src/os_posix/os_time.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/os_posix/os_time.c')
-rw-r--r--src/os_posix/os_time.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/os_posix/os_time.c b/src/os_posix/os_time.c
index 6f150ee8ffe..fe337fea7cf 100644
--- a/src/os_posix/os_time.c
+++ b/src/os_posix/os_time.c
@@ -16,6 +16,7 @@ void
__wt_epoch(WT_SESSION_IMPL *session, struct timespec *tsp)
WT_GCC_FUNC_ATTRIBUTE((visibility("default")))
{
+ struct timespec tmp;
WT_DECL_RET;
/*
@@ -27,21 +28,34 @@ __wt_epoch(WT_SESSION_IMPL *session, struct timespec *tsp)
tsp->tv_sec = 0;
tsp->tv_nsec = 0;
+ /*
+ * Read into a local variable so that we're comparing the correct
+ * value when we check for monotonic increasing time. There are
+ * many places we read into an unlocked global variable.
+ */
#if defined(HAVE_CLOCK_GETTIME)
- WT_SYSCALL_RETRY(clock_gettime(CLOCK_REALTIME, tsp), ret);
- if (ret == 0)
+ WT_SYSCALL_RETRY(clock_gettime(CLOCK_REALTIME, &tmp), ret);
+ if (ret == 0) {
+ __wt_time_check_monotonic(session, &tmp);
+ tsp->tv_sec = tmp.tv_sec;
+ tsp->tv_nsec = tmp.tv_nsec;
return;
+ }
WT_PANIC_MSG(session, ret, "clock_gettime");
#elif defined(HAVE_GETTIMEOFDAY)
+ {
struct timeval v;
WT_SYSCALL_RETRY(gettimeofday(&v, NULL), ret);
if (ret == 0) {
- tsp->tv_sec = v.tv_sec;
- tsp->tv_nsec = v.tv_usec * WT_THOUSAND;
+ tmp.tv_sec = v.tv_sec;
+ tmp.tv_nsec = v.tv_usec * WT_THOUSAND;
+ __wt_time_check_monotonic(session, &tmp);
+ *tsp = tmp;
return;
}
WT_PANIC_MSG(session, ret, "gettimeofday");
+ }
#else
NO TIME-OF-DAY IMPLEMENTATION: see src/os_posix/os_time.c
#endif