Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(184)

Unified Diff: src/platform/time.cc

Issue 51333007: Use CLOCK_MONOTONIC_COARSE and CLOCK_REALTIME_COARSE on Linux if available. (Closed)
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/platform/time.cc
diff --git a/src/platform/time.cc b/src/platform/time.cc
index de0ca16473f6b5106485508653cfe797f6632c37..a6c426f62db48c4e71f18b4b5789744baf1c597a 100644
--- a/src/platform/time.cc
+++ b/src/platform/time.cc
@@ -28,6 +28,7 @@
#include "platform/time.h"
#if V8_OS_POSIX
+#include <errno.h>
#include <sys/time.h>
#endif
#if V8_OS_MACOSX
@@ -270,6 +271,8 @@ FILETIME Time::ToFiletime() const {
#elif V8_OS_POSIX
+// OS X doesn't support POSIX high-res timers and Solaris uses gethrtime().
+#if V8_OS_MACOSX || V8_OS_SOLARIS
Time Time::Now() {
struct timeval tv;
int result = gettimeofday(&tv, NULL);
@@ -277,6 +280,36 @@ Time Time::Now() {
USE(result);
return FromTimeval(tv);
}
+#else
+inline int GetBestMonotonicClock(struct timespec* ts) {
+#if V8_OS_LINUX
+ // Prefer CLOCK_MONOTONIC_COARSE. It's a high-res clock that's available as
+ // of 2.6.32. It can be fully serviced from the vDSO, even on virtualized
+ // systems, which saves the overhead of a system call. The coarseness is not
+ // an issue for us because it still has sub-microsecond resolution.
+ static bool no_clock_monotonic_coarse;
+ if (no_clock_monotonic_coarse == false) {
Sven Panne 2013/10/30 12:54:11 http://refactoring.com/catalog/removeDoubleNegativ
bnoordhuis 2013/10/30 13:38:56 Agree on the double negative but I wrote it this w
Sven Panne 2013/10/30 14:26:50 OK, I was a bit confused. What I meant was the fac
+ if (clock_gettime(6 /* CLOCK_MONOTONIC_COARSE */, ts) == 0) {
Benedikt Meurer 2013/10/30 12:49:15 I don't like hardcoding the constant here. Better
+ return 0;
+ }
+ if (errno != EINVAL) {
+ return -1;
+ }
+ no_clock_monotonic_coarse = true;
+ }
+#endif // V8_OS_LINUX
+ return clock_gettime(CLOCK_MONOTONIC, ts);
+}
+
+
+Time Time::Now() {
Benedikt Meurer 2013/10/30 12:49:15 Time::Now() has to use gettimeofday() on POSIX sys
bnoordhuis 2013/10/30 13:38:56 You mean CLOCK_REALTIME_COARSE is not allowed? If
Benedikt Meurer 2013/10/30 13:50:04 CLOCK_MONOTONIC != CLOCK_REALTIME. Time values hav
bnoordhuis 2013/10/30 14:18:40 Trying to deepen my understanding here. Is that b
+ struct timespec ts;
+ int result = GetBestMonotonicClock(&ts);
+ ASSERT_EQ(0, result);
+ USE(result);
+ return FromTimespec(ts);
+}
+#endif // V8_OS_MACOSX || V8_OS_SOLARIS
Time Time::NowFromSystemTime() {
@@ -570,7 +603,7 @@ 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);
+ int result = GetBestMonotonicClock(&ts);
Benedikt Meurer 2013/10/30 12:49:15 Please take a look at the Xorg GetTimeInMillis() f
bnoordhuis 2013/10/30 13:38:56 What in particular do you want to steal^Wcopy? Th
Benedikt Meurer 2013/10/30 13:50:04 static clockid_t clockid; if (!clockid) { #ifd
bnoordhuis 2013/10/30 14:18:40 I'm a man of many qualities but mind reading is no
ASSERT_EQ(0, result);
USE(result);
ticks = (ts.tv_sec * Time::kMicrosecondsPerSecond +
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698