| OLD | NEW | 
|---|
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "src/base/platform/time.h" | 5 #include "src/base/platform/time.h" | 
| 6 | 6 | 
| 7 #if V8_OS_POSIX | 7 #if V8_OS_POSIX | 
| 8 #include <fcntl.h>  // for O_RDONLY | 8 #include <fcntl.h>  // for O_RDONLY | 
| 9 #include <sys/time.h> | 9 #include <sys/time.h> | 
| 10 #include <unistd.h> | 10 #include <unistd.h> | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 49   return absolute_micros.ValueOrDie(); | 49   return absolute_micros.ValueOrDie(); | 
| 50 } | 50 } | 
| 51 #elif V8_OS_POSIX | 51 #elif V8_OS_POSIX | 
| 52 // Helper function to get results from clock_gettime() and convert to a | 52 // Helper function to get results from clock_gettime() and convert to a | 
| 53 // microsecond timebase. Minimum requirement is MONOTONIC_CLOCK to be supported | 53 // microsecond timebase. Minimum requirement is MONOTONIC_CLOCK to be supported | 
| 54 // on the system. FreeBSD 6 has CLOCK_MONOTONIC but defines | 54 // on the system. FreeBSD 6 has CLOCK_MONOTONIC but defines | 
| 55 // _POSIX_MONOTONIC_CLOCK to -1. | 55 // _POSIX_MONOTONIC_CLOCK to -1. | 
| 56 V8_INLINE int64_t ClockNow(clockid_t clk_id) { | 56 V8_INLINE int64_t ClockNow(clockid_t clk_id) { | 
| 57 #if (defined(_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK >= 0) || \ | 57 #if (defined(_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK >= 0) || \ | 
| 58   defined(V8_OS_BSD) || defined(V8_OS_ANDROID) | 58   defined(V8_OS_BSD) || defined(V8_OS_ANDROID) | 
|  | 59 // On AIX clock_gettime for CLOCK_THREAD_CPUTIME_ID outputs time with | 
|  | 60 // resolution of 10ms. thread_cputime API provides the time in ns | 
|  | 61 #if defined(V8_OS_AIX) | 
|  | 62   thread_cputime_t tc; | 
|  | 63   if (clk_id == CLOCK_THREAD_CPUTIME_ID) { | 
|  | 64     if (thread_cputime(-1, &tc) != 0) { | 
|  | 65       UNREACHABLE(); | 
|  | 66       return 0; | 
|  | 67     } | 
|  | 68   } | 
|  | 69 #endif | 
| 59   struct timespec ts; | 70   struct timespec ts; | 
| 60   if (clock_gettime(clk_id, &ts) != 0) { | 71   if (clock_gettime(clk_id, &ts) != 0) { | 
| 61     UNREACHABLE(); | 72     UNREACHABLE(); | 
| 62     return 0; | 73     return 0; | 
| 63   } | 74   } | 
| 64   v8::base::internal::CheckedNumeric<int64_t> result(ts.tv_sec); | 75   v8::base::internal::CheckedNumeric<int64_t> result(ts.tv_sec); | 
| 65   result *= v8::base::Time::kMicrosecondsPerSecond; | 76   result *= v8::base::Time::kMicrosecondsPerSecond; | 
|  | 77 #if defined(V8_OS_AIX) | 
|  | 78   if (clk_id == CLOCK_THREAD_CPUTIME_ID) { | 
|  | 79     result += (tc.stime / v8::base::Time::kNanosecondsPerMicrosecond); | 
|  | 80   } else { | 
|  | 81     result += (ts.tv_nsec / v8::base::Time::kNanosecondsPerMicrosecond); | 
|  | 82   } | 
|  | 83 #else | 
| 66   result += (ts.tv_nsec / v8::base::Time::kNanosecondsPerMicrosecond); | 84   result += (ts.tv_nsec / v8::base::Time::kNanosecondsPerMicrosecond); | 
|  | 85 #endif | 
| 67   return result.ValueOrDie(); | 86   return result.ValueOrDie(); | 
| 68 #else  // Monotonic clock not supported. | 87 #else  // Monotonic clock not supported. | 
| 69   return 0; | 88   return 0; | 
| 70 #endif | 89 #endif | 
| 71 } | 90 } | 
| 72 #elif V8_OS_WIN | 91 #elif V8_OS_WIN | 
| 73 V8_INLINE bool IsQPCReliable() { | 92 V8_INLINE bool IsQPCReliable() { | 
| 74   v8::base::CPU cpu; | 93   v8::base::CPU cpu; | 
| 75   // On Athlon X2 CPUs (e.g. model 15) QueryPerformanceCounter is unreliable. | 94   // On Athlon X2 CPUs (e.g. model 15) QueryPerformanceCounter is unreliable. | 
| 76   return strcmp(cpu.vendor(), "AuthenticAMD") == 0 && cpu.family() == 15; | 95   return strcmp(cpu.vendor(), "AuthenticAMD") == 0 && cpu.family() == 15; | 
| (...skipping 655 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 732   DCHECK_GE(tsc_now, tsc_initial); | 751   DCHECK_GE(tsc_now, tsc_initial); | 
| 733   uint64_t tsc_ticks = tsc_now - tsc_initial; | 752   uint64_t tsc_ticks = tsc_now - tsc_initial; | 
| 734   tsc_ticks_per_second = tsc_ticks / elapsed_time_seconds; | 753   tsc_ticks_per_second = tsc_ticks / elapsed_time_seconds; | 
| 735 | 754 | 
| 736   return tsc_ticks_per_second; | 755   return tsc_ticks_per_second; | 
| 737 } | 756 } | 
| 738 #endif  // V8_OS_WIN | 757 #endif  // V8_OS_WIN | 
| 739 | 758 | 
| 740 }  // namespace base | 759 }  // namespace base | 
| 741 }  // namespace v8 | 760 }  // namespace v8 | 
| OLD | NEW | 
|---|