Index: runtime/vm/os_win.cc |
diff --git a/runtime/vm/os_win.cc b/runtime/vm/os_win.cc |
index 85133418f1de562b9b26421541df1e7f68582824..0e07cdf919ea5cf3f9c18d71d0554ee082d48af1 100644 |
--- a/runtime/vm/os_win.cc |
+++ b/runtime/vm/os_win.cc |
@@ -121,6 +121,26 @@ int64_t OS::GetCurrentTimeMicros() { |
} |
+static int64_t qpc_ticks_per_second = 0; |
+ |
+int64_t OS::GetCurrentTraceMicros() { |
+ if (qpc_ticks_per_second == 0) { |
+ // QueryPerformanceCounter not supported, fallback. |
+ return GetCurrentTimeMicros(); |
+ } |
+ // Grab performance counter value. |
+ LARGE_INTEGER now; |
+ QueryPerformanceCounter(&now); |
+ int64_t qpc_value = static_cast<int64_t>(now.QuadPart); |
+ // Convert to microseconds. |
+ int64_t seconds = qpc_value / qpc_ticks_per_second; |
+ int64_t leftover_ticks = qpc_value - (seconds * qpc_ticks_per_second); |
+ int64_t result = seconds * kMicrosecondsPerSecond; |
+ result += ((leftover_ticks * kMicrosecondsPerSecond) / qpc_ticks_per_second); |
+ return result; |
+} |
+ |
+ |
void* OS::AlignedAllocate(intptr_t size, intptr_t alignment) { |
const int kMinimumAlignment = 16; |
ASSERT(Utils::IsPowerOfTwo(alignment)); |
@@ -350,6 +370,12 @@ void OS::InitOnce() { |
_set_abort_behavior(0, _WRITE_ABORT_MSG); |
MonitorWaitData::monitor_wait_data_key_ = OSThread::CreateThreadLocal(); |
MonitorData::GetMonitorWaitDataForThread(); |
+ LARGE_INTEGER ticks_per_sec; |
+ if (!QueryPerformanceFrequency(&ticks_per_sec)) { |
+ qpc_ticks_per_second = 0; |
+ } else { |
+ qpc_ticks_per_second = static_cast<int64_t>(ticks_per_sec.QuadPart); |
+ } |
} |