13 #include <mach/mach_time.h>
29 TimeDelta TimeDelta::FromDays(
int days) {
30 return TimeDelta(days * Time::kMicrosecondsPerDay);
34 TimeDelta TimeDelta::FromHours(
int hours) {
35 return TimeDelta(hours * Time::kMicrosecondsPerHour);
39 TimeDelta TimeDelta::FromMinutes(
int minutes) {
40 return TimeDelta(minutes * Time::kMicrosecondsPerMinute);
44 TimeDelta TimeDelta::FromSeconds(int64_t seconds) {
45 return TimeDelta(seconds * Time::kMicrosecondsPerSecond);
49 TimeDelta TimeDelta::FromMilliseconds(int64_t milliseconds) {
50 return TimeDelta(milliseconds * Time::kMicrosecondsPerMillisecond);
54 TimeDelta TimeDelta::FromNanoseconds(int64_t nanoseconds) {
55 return TimeDelta(nanoseconds / Time::kNanosecondsPerMicrosecond);
59 int TimeDelta::InDays()
const {
60 return static_cast<int>(delta_ / Time::kMicrosecondsPerDay);
64 int TimeDelta::InHours()
const {
65 return static_cast<int>(delta_ / Time::kMicrosecondsPerHour);
69 int TimeDelta::InMinutes()
const {
70 return static_cast<int>(delta_ / Time::kMicrosecondsPerMinute);
74 double TimeDelta::InSecondsF()
const {
75 return static_cast<double>(delta_) / Time::kMicrosecondsPerSecond;
79 int64_t TimeDelta::InSeconds()
const {
80 return delta_ / Time::kMicrosecondsPerSecond;
84 double TimeDelta::InMillisecondsF()
const {
85 return static_cast<double>(delta_) / Time::kMicrosecondsPerMillisecond;
89 int64_t TimeDelta::InMilliseconds()
const {
90 return delta_ / Time::kMicrosecondsPerMillisecond;
94 int64_t TimeDelta::InNanoseconds()
const {
95 return delta_ * Time::kNanosecondsPerMicrosecond;
101 TimeDelta TimeDelta::FromMachTimespec(
struct mach_timespec ts) {
104 static_cast<long>(Time::kNanosecondsPerSecond));
105 return TimeDelta(ts.tv_sec * Time::kMicrosecondsPerSecond +
106 ts.tv_nsec / Time::kNanosecondsPerMicrosecond);
110 struct mach_timespec TimeDelta::ToMachTimespec() const {
111 struct mach_timespec ts;
113 ts.tv_sec = delta_ / Time::kMicrosecondsPerSecond;
114 ts.tv_nsec = (delta_ % Time::kMicrosecondsPerSecond) *
115 Time::kNanosecondsPerMicrosecond;
124 TimeDelta TimeDelta::FromTimespec(
struct timespec ts) {
127 static_cast<long>(Time::kNanosecondsPerSecond));
128 return TimeDelta(ts.tv_sec * Time::kMicrosecondsPerSecond +
129 ts.tv_nsec / Time::kNanosecondsPerMicrosecond);
133 struct timespec TimeDelta::ToTimespec() const {
135 ts.tv_sec = delta_ / Time::kMicrosecondsPerSecond;
136 ts.tv_nsec = (delta_ % Time::kMicrosecondsPerSecond) *
137 Time::kNanosecondsPerMicrosecond;
151 Clock() : initial_ticks_(GetSystemTicks()), initial_time_(GetSystemTime()) {}
155 const TimeDelta kMaxElapsedTime = TimeDelta::FromMinutes(1);
157 LockGuard<Mutex> lock_guard(&mutex_);
160 TimeTicks ticks = GetSystemTicks();
161 Time time = GetSystemTime();
165 TimeDelta elapsed = ticks - initial_ticks_;
166 if (time < initial_time_ || elapsed > kMaxElapsedTime) {
167 initial_ticks_ = ticks;
168 initial_time_ = time;
172 return initial_time_ + elapsed;
175 Time NowFromSystemTime() {
176 LockGuard<Mutex> lock_guard(&mutex_);
177 initial_ticks_ = GetSystemTicks();
178 initial_time_ = GetSystemTime();
179 return initial_time_;
183 static TimeTicks GetSystemTicks() {
184 return TimeTicks::Now();
187 static Time GetSystemTime() {
189 ::GetSystemTimeAsFileTime(&ft);
190 return Time::FromFiletime(ft);
193 TimeTicks initial_ticks_;
199 static LazyStaticInstance<Clock, DefaultConstructTrait<Clock>,
200 ThreadSafeInitOnceTrait>::type clock =
205 return clock.Pointer()->Now();
209 Time Time::NowFromSystemTime() {
210 return clock.Pointer()->NowFromSystemTime();
215 static const int64_t kTimeToEpochInMicroseconds =
V8_INT64_C(11644473600000000);
218 Time Time::FromFiletime(FILETIME ft) {
219 if (ft.dwLowDateTime == 0 && ft.dwHighDateTime == 0) {
222 if (ft.dwLowDateTime == std::numeric_limits<DWORD>::max() &&
223 ft.dwHighDateTime == std::numeric_limits<DWORD>::max()) {
226 int64_t us = (
static_cast<uint64_t
>(ft.dwLowDateTime) +
227 (
static_cast<uint64_t
>(ft.dwHighDateTime) << 32)) / 10;
228 return Time(us - kTimeToEpochInMicroseconds);
232 FILETIME Time::ToFiletime()
const {
236 ft.dwLowDateTime = 0;
237 ft.dwHighDateTime = 0;
241 ft.dwLowDateTime = std::numeric_limits<DWORD>::max();
242 ft.dwHighDateTime = std::numeric_limits<DWORD>::max();
245 uint64_t us =
static_cast<uint64_t
>(us_ + kTimeToEpochInMicroseconds) * 10;
246 ft.dwLowDateTime =
static_cast<DWORD>(us);
247 ft.dwHighDateTime =
static_cast<DWORD>(us >> 32);
255 int result = gettimeofday(&tv,
NULL);
258 return FromTimeval(tv);
262 Time Time::NowFromSystemTime() {
267 Time Time::FromTimespec(
struct timespec ts) {
269 DCHECK(ts.tv_nsec <
static_cast<long>(kNanosecondsPerSecond));
270 if (ts.tv_nsec == 0 && ts.tv_sec == 0) {
273 if (ts.tv_nsec ==
static_cast<long>(kNanosecondsPerSecond - 1) &&
274 ts.tv_sec == std::numeric_limits<time_t>::max()) {
277 return Time(ts.tv_sec * kMicrosecondsPerSecond +
278 ts.tv_nsec / kNanosecondsPerMicrosecond);
282 struct timespec Time::ToTimespec() const {
290 ts.tv_sec = std::numeric_limits<time_t>::max();
291 ts.tv_nsec =
static_cast<long>(kNanosecondsPerSecond - 1);
294 ts.tv_sec = us_ / kMicrosecondsPerSecond;
295 ts.tv_nsec = (us_ % kMicrosecondsPerSecond) * kNanosecondsPerMicrosecond;
300 Time Time::FromTimeval(
struct timeval tv) {
302 DCHECK(tv.tv_usec <
static_cast<suseconds_t
>(kMicrosecondsPerSecond));
303 if (tv.tv_usec == 0 && tv.tv_sec == 0) {
306 if (tv.tv_usec ==
static_cast<suseconds_t
>(kMicrosecondsPerSecond - 1) &&
307 tv.tv_sec == std::numeric_limits<time_t>::max()) {
310 return Time(tv.tv_sec * kMicrosecondsPerSecond + tv.tv_usec);
314 struct timeval Time::ToTimeval() const {
322 tv.tv_sec = std::numeric_limits<time_t>::max();
323 tv.tv_usec =
static_cast<suseconds_t
>(kMicrosecondsPerSecond - 1);
326 tv.tv_sec = us_ / kMicrosecondsPerSecond;
327 tv.tv_usec = us_ % kMicrosecondsPerSecond;
334 Time Time::FromJsTime(
double ms_since_epoch) {
337 if (ms_since_epoch == std::numeric_limits<double>::max()) {
341 static_cast<int64_t
>(ms_since_epoch * kMicrosecondsPerMillisecond));
345 double Time::ToJsTime()
const {
352 return std::numeric_limits<double>::max();
354 return static_cast<double>(us_) / kMicrosecondsPerMillisecond;
362 virtual ~TickClock() {}
363 virtual int64_t Now() = 0;
364 virtual bool IsHighResolution() = 0;
396 class HighResolutionTickClock
FINAL :
public TickClock {
398 explicit HighResolutionTickClock(int64_t ticks_per_second)
399 : ticks_per_second_(ticks_per_second) {
402 virtual ~HighResolutionTickClock() {}
406 BOOL result = QueryPerformanceCounter(&now);
412 int64_t whole_seconds = now.QuadPart / ticks_per_second_;
413 int64_t leftover_ticks = now.QuadPart % ticks_per_second_;
414 int64_t ticks = (whole_seconds * Time::kMicrosecondsPerSecond) +
415 ((leftover_ticks * Time::kMicrosecondsPerSecond) / ticks_per_second_);
422 virtual bool IsHighResolution()
OVERRIDE {
427 int64_t ticks_per_second_;
431 class RolloverProtectedTickClock
FINAL :
public TickClock {
435 RolloverProtectedTickClock() : last_seen_now_(0), rollover_ms_(1) {}
436 virtual ~RolloverProtectedTickClock() {}
439 LockGuard<Mutex> lock_guard(&mutex_);
449 DWORD now = timeGetTime();
450 if (now < last_seen_now_) {
453 last_seen_now_ = now;
454 return (now + rollover_ms_) * Time::kMicrosecondsPerMillisecond;
457 virtual bool IsHighResolution()
OVERRIDE {
463 DWORD last_seen_now_;
464 int64_t rollover_ms_;
468 static LazyStaticInstance<RolloverProtectedTickClock,
469 DefaultConstructTrait<RolloverProtectedTickClock>,
470 ThreadSafeInitOnceTrait>::type tick_clock =
474 struct CreateHighResTickClockTrait {
475 static TickClock* Create() {
478 LARGE_INTEGER ticks_per_second;
479 if (!QueryPerformanceFrequency(&ticks_per_second)) {
480 return tick_clock.Pointer();
486 if (strcmp(cpu.vendor(),
"AuthenticAMD") == 0 && cpu.family() == 15) {
487 return tick_clock.Pointer();
490 return new HighResolutionTickClock(ticks_per_second.QuadPart);
495 static LazyDynamicInstance<TickClock, CreateHighResTickClockTrait,
496 ThreadSafeInitOnceTrait>::type high_res_tick_clock =
500 TimeTicks TimeTicks::Now() {
502 TimeTicks ticks(tick_clock.Pointer()->Now());
508 TimeTicks TimeTicks::HighResolutionNow() {
510 TimeTicks ticks(high_res_tick_clock.Pointer()->Now());
517 bool TimeTicks::IsHighResolutionClockWorking() {
518 return high_res_tick_clock.Pointer()->IsHighResolution();
523 TimeTicks TimeTicks::KernelTimestampNow() {
return TimeTicks(0); }
527 bool TimeTicks::KernelTimestampAvailable() {
return false; }
531 TimeTicks TimeTicks::Now() {
532 return HighResolutionNow();
536 TimeTicks TimeTicks::HighResolutionNow() {
539 static struct mach_timebase_info info;
540 if (info.denom == 0) {
541 kern_return_t result = mach_timebase_info(&info);
545 ticks = (mach_absolute_time() / Time::kNanosecondsPerMicrosecond *
546 info.numer / info.denom);
548 ticks = (gethrtime() / Time::kNanosecondsPerMicrosecond);
549 #elif V8_LIBRT_NOT_AVAILABLE
554 int result = gettimeofday(&tv,
NULL);
557 ticks = (tv.tv_sec * Time::kMicrosecondsPerSecond + tv.tv_usec);
560 int result = clock_gettime(CLOCK_MONOTONIC, &ts);
563 ticks = (ts.tv_sec * Time::kMicrosecondsPerSecond +
564 ts.tv_nsec / Time::kNanosecondsPerMicrosecond);
567 return TimeTicks(ticks + 1);
572 bool TimeTicks::IsHighResolutionClockWorking() {
577 #if V8_OS_LINUX && !V8_LIBRT_NOT_AVAILABLE
579 class KernelTimestampClock {
582 clock_fd_ = open(kTraceClockDevice, O_RDONLY);
583 if (clock_fd_ == -1) {
586 clock_id_ = get_clockid(clock_fd_);
590 if (clock_fd_ != -1) {
596 if (clock_id_ == kClockInvalid) {
602 clock_gettime(clock_id_, &ts);
603 return ((int64_t)ts.tv_sec * kNsecPerSec) + ts.tv_nsec;
606 bool Available() {
return clock_id_ != kClockInvalid; }
609 static const clockid_t kClockInvalid = -1;
610 static const char kTraceClockDevice[];
611 static const uint64_t kNsecPerSec = 1000000000;
616 static int get_clockid(
int fd) {
return ((~(clockid_t)(fd) << 3) | 3); }
621 const char KernelTimestampClock::kTraceClockDevice[] =
"/dev/trace_clock";
629 int64_t
Now() {
return 0; }
635 static LazyStaticInstance<KernelTimestampClock,
636 DefaultConstructTrait<KernelTimestampClock>,
642 TimeTicks TimeTicks::KernelTimestampNow() {
648 bool TimeTicks::KernelTimestampAvailable() {
enable harmony numeric enable harmony object literal extensions Optimize object Array DOM strings and string trace pretenuring decisions of HAllocate instructions Enables optimizations which favor memory size over execution speed maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining trace the tracking of allocation sites deoptimize every n garbage collections perform array bounds checks elimination analyze liveness of environment slots and zap dead values flushes the cache of optimized code for closures on every GC allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes enable context specialization in TurboFan execution budget before interrupt is triggered max percentage of megamorphic generic ICs to allow optimization enable use of SAHF instruction if enable use of VFP3 instructions if available enable use of NEON instructions if enable use of SDIV and UDIV instructions if enable use of MLS instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of d16 d31 registers on ARM this requires VFP3 force all emitted branches to be in long enable alignment of csp to bytes on platforms which prefer the register to always be NULL
#define LAZY_STATIC_INSTANCE_INITIALIZER
#define LAZY_DYNAMIC_INSTANCE_INITIALIZER
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
static LazyStaticInstance< KernelTimestampClock, DefaultConstructTrait< KernelTimestampClock >, ThreadSafeInitOnceTrait >::type kernel_tick_clock
typedef DWORD(__stdcall *DLL_FUNC_TYPE(SymGetOptions))(VOID)
typedef BOOL(__stdcall *DLL_FUNC_TYPE(SymInitialize))(IN HANDLE hProcess
static LifetimePosition Max(LifetimePosition a, LifetimePosition b)
Debugger support for the V8 JavaScript engine.