| 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);
|
| + }
|
| }
|
|
|
|
|
|
|