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

Use CLOCK_MONOTONIC_COARSE and CLOCK_REALTIME_COARSE on Linux if available.

R=bmeurer@chromium.org

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

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

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17611 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent b9ce6684
......@@ -43,6 +43,15 @@
#include "win32-headers.h"
#endif
#if V8_OS_LINUX
#if !defined(CLOCK_REALTIME_COARSE)
#define CLOCK_REALTIME_COARSE 5 // 2.6.32 and up.
#endif // !defined(CLOCK_REALTIME_COARSE)
#if !defined(CLOCK_MONOTONIC_COARSE)
#define CLOCK_MONOTONIC_COARSE 6 // 2.6.32 and up.
#endif // !defined(CLOCK_MONOTONIC_COARSE)
#endif // V8_OS_LINUX
namespace v8 {
namespace internal {
......@@ -271,11 +280,29 @@ FILETIME Time::ToFiletime() const {
#elif V8_OS_POSIX
Time Time::Now() {
#if V8_OS_LINUX
// Use CLOCK_REALTIME_COARSE if it's available and has a precision of 1 ms
// or higher. It's serviced from the vDSO with no system call overhead.
static clock_t clock_id = -1;
struct timespec ts;
if (clock_id == -1) {
if (clock_getres(CLOCK_REALTIME_COARSE, &ts) || ts.tv_nsec > 1000 * 1000) {
clock_id = CLOCK_REALTIME;
} else {
clock_id = CLOCK_REALTIME_COARSE;
}
}
int result = clock_gettime(clock_id, &ts);
ASSERT_EQ(0, result);
USE(result);
return FromTimespec(ts);
#else // V8_OS_LINUX
struct timeval tv;
int result = gettimeofday(&tv, NULL);
ASSERT_EQ(0, result);
USE(result);
return FromTimeval(tv);
#endif // V8_OS_LINUX
}
......@@ -570,7 +597,21 @@ TimeTicks TimeTicks::HighResolutionNow() {
ticks = (tv.tv_sec * Time::kMicrosecondsPerSecond + tv.tv_usec);
#elif V8_OS_POSIX
struct timespec ts;
#if V8_OS_LINUX
// Use CLOCK_MONOTONIC_COARSE if it's available and has a precision of 1 ms
// or higher. It's serviced from the vDSO with no system call overhead.
static clock_t clock_id = -1;
if (clock_id == -1) {
if (clock_getres(CLOCK_MONOTONIC_COARSE, &ts) || ts.tv_nsec > 1000 * 1000) {
clock_id = CLOCK_MONOTONIC;
} else {
clock_id = CLOCK_MONOTONIC_COARSE;
}
}
int result = clock_gettime(clock_id, &ts);
#else
int result = clock_gettime(CLOCK_MONOTONIC, &ts);
#endif // V8_OS_LINUX
ASSERT_EQ(0, result);
USE(result);
ticks = (ts.tv_sec * Time::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