From a20330e846f4067d79a02dc9ba341a2ad2fb9299 Mon Sep 17 00:00:00 2001 From: "bmeurer@chromium.org" Date: Tue, 12 Nov 2013 12:18:35 +0000 Subject: [PATCH] linux: use CLOCK_{REALTIME,MONOTONIC}_COARSE R=bmeurer@chromium.org Review URL: https://codereview.chromium.org/68203004 Patch from Ben Noordhuis . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17642 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/platform/time.cc | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++- src/platform/time.h | 2 ++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/platform/time.cc b/src/platform/time.cc index de0ca16..d87dc24 100644 --- a/src/platform/time.cc +++ b/src/platform/time.cc @@ -43,6 +43,17 @@ #include "win32-headers.h" #endif +// Make sure CLOCK_{MONOTONIC,REALTIME}_COARSE is defined on Linux. +#if V8_OS_LINUX +# if !defined(CLOCK_REALTIME_COARSE) +# define CLOCK_REALTIME_COARSE 5 // 2.6.32 and up. +# endif +# if !defined(CLOCK_MONOTONIC_COARSE) +# define CLOCK_MONOTONIC_COARSE 6 // 2.6.32 and up. +# endif +#endif // V8_OS_LINUX + + namespace v8 { namespace internal { @@ -271,11 +282,38 @@ FILETIME Time::ToFiletime() const { #elif V8_OS_POSIX Time Time::Now() { +#if V8_LIBRT_NOT_AVAILABLE + // TODO(bmeurer): This is a temporary hack to support cross-compiling + // Chrome for Android in AOSP. Remove this once AOSP is fixed, also + // cleanup the tools/gyp/v8.gyp file. struct timeval tv; int result = gettimeofday(&tv, NULL); ASSERT_EQ(0, result); USE(result); return FromTimeval(tv); +#elif defined(CLOCK_REALTIME_COARSE) + struct timespec ts; + // Use CLOCK_REALTIME_COARSE if it's available and has a precision of 1ms + // or higher. It's serviced from the vDSO with no system call overhead. + static clock_t clock_id = static_cast(0); + if (!clock_id) { + if (clock_getres(CLOCK_REALTIME_COARSE, &ts) == 0 + && ts.tv_nsec <= kNanosecondsPerMillisecond) + clock_id = CLOCK_REALTIME_COARSE; + else + clock_id = CLOCK_REALTIME; + } + int result = clock_gettime(clock_id, &ts); + ASSERT_EQ(0, result); + USE(result); + return FromTimespec(ts); +#else + struct timeval tv; + int result = gettimeofday(&tv, NULL); + ASSERT_EQ(0, result); + USE(result); + return FromTimeval(tv); +#endif // V8_LIBRT_NOT_AVAILABLE } @@ -570,7 +608,21 @@ TimeTicks TimeTicks::HighResolutionNow() { ticks = (tv.tv_sec * Time::kMicrosecondsPerSecond + tv.tv_usec); #elif V8_OS_POSIX struct timespec ts; - int result = clock_gettime(CLOCK_MONOTONIC, &ts); +#if defined(CLOCK_MONOTONIC_COARSE) + // Use CLOCK_MONOTONIC_COARSE if it's available and has a precision of 1ms + // or higher. It's serviced from the vDSO with no system call overhead. + static clock_t clock_id = static_cast(0); + if (!clock_id) { + if (clock_getres(CLOCK_MONOTONIC_COARSE, &ts) == 0 + && ts.tv_nsec <= Time::kNanosecondsPerMillisecond) + clock_id = CLOCK_MONOTONIC_COARSE; + else + clock_id = CLOCK_MONOTONIC; + } +#else + static const clock_t clock_id = CLOCK_MONOTONIC; +#endif // defined(CLOCK_MONOTONIC_COARSE) + int result = clock_gettime(clock_id, &ts); ASSERT_EQ(0, result); USE(result); ticks = (ts.tv_sec * Time::kMicrosecondsPerSecond + diff --git a/src/platform/time.h b/src/platform/time.h index 877e020..7e5d59b 100644 --- a/src/platform/time.h +++ b/src/platform/time.h @@ -192,6 +192,8 @@ class Time V8_FINAL BASE_EMBEDDED { static const int64_t kMicrosecondsPerDay = kMicrosecondsPerHour * 24; static const int64_t kMicrosecondsPerWeek = kMicrosecondsPerDay * 7; static const int64_t kNanosecondsPerMicrosecond = 1000; + static const int64_t kNanosecondsPerMillisecond = kNanosecondsPerMicrosecond * + kMicrosecondsPerMillisecond; static const int64_t kNanosecondsPerSecond = kNanosecondsPerMicrosecond * kMicrosecondsPerSecond; -- 2.7.4