Commit a20330e8 authored by bmeurer@chromium.org's avatar bmeurer@chromium.org

linux: use CLOCK_{REALTIME,MONOTONIC}_COARSE

R=bmeurer@chromium.org

Review URL: https://codereview.chromium.org/68203004

Patch from Ben Noordhuis <info@bnoordhuis.nl>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17642 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 6aad7fb9
......@@ -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<clock_t>(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<clock_t>(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 +
......
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment