Index: tools/win/IdleWakeups/power_sampler.cpp |
diff --git a/tools/win/IdleWakeups/power_sampler.cpp b/tools/win/IdleWakeups/power_sampler.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e0462cae71d6a5452c93fa6dd7a8ca6e00a81d09 |
--- /dev/null |
+++ b/tools/win/IdleWakeups/power_sampler.cpp |
@@ -0,0 +1,75 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "stdafx.h" |
+ |
+#include "power_sampler.h" |
+ |
+// These correspond to the funcID values returned by GetMsrFunc |
+const int MSR_FUNC_FREQ = 0; |
+const int MSR_FUNC_POWER = 1; |
+const int MSR_FUNC_TEMP = 2; |
+const int MSR_FUNC_MAX_POWER = 3; /* ????? */ |
+ |
+void PowerSampler::SampleCPUPowerState() { |
+ if (!IntelEnergyLibInitialize || !GetNumMsrs || !GetMsrName || !GetMsrFunc || |
+ !GetPowerData || !ReadSample) { |
+ return; |
+ } |
+ |
+ int num_MSRs = 0; |
+ GetNumMsrs(&num_MSRs); |
+ ReadSample(); |
+ |
+ for (int i = 0; i < num_MSRs; ++i) { |
+ int func_id; |
+ wchar_t MSR_name[1024]; |
+ GetMsrFunc(i, &func_id); |
+ |
+ int nData; |
+ double data[3] = {}; |
+ GetPowerData(0, i, data, &nData); |
+ |
+ if (func_id == MSR_FUNC_POWER) { |
+ // data[0] is Power (W) |
+ // data[1] is Energy (J) |
+ // data[2] is Energy (mWh) |
+ // Round to nearest .0001 to avoid distracting excess precision. |
+ GetMsrName(i, MSR_name); |
+ power_[MSR_name] = round(data[0] * 10000) / 10000; |
+ } |
+ } |
+} |
+ |
+PowerSampler::PowerSampler() { |
+// If Intel Power Gadget is installed then use it to get CPU power data. |
+#if _M_X64 |
+ PCWSTR dllName = L"\\EnergyLib64.dll"; |
+#else |
+ PCWSTR dllName = L"\\EnergyLib32.dll"; |
+#endif |
+#pragma warning(disable : 4996) |
+ PCWSTR powerGadgetDir = _wgetenv(L"IPG_Dir"); |
+ if (powerGadgetDir) |
+ energy_lib_ = LoadLibrary((std::wstring(powerGadgetDir) + dllName).c_str()); |
+ if (energy_lib_) { |
+ IntelEnergyLibInitialize = (IntelEnergyLibInitialize_t)GetProcAddress( |
+ energy_lib_, "IntelEnergyLibInitialize"); |
+ GetNumMsrs = (GetNumMsrs_t)GetProcAddress(energy_lib_, "GetNumMsrs"); |
+ GetMsrName = (GetMsrName_t)GetProcAddress(energy_lib_, "GetMsrName"); |
+ GetMsrFunc = (GetMsrFunc_t)GetProcAddress(energy_lib_, "GetMsrFunc"); |
+ GetPowerData = (GetPowerData_t)GetProcAddress(energy_lib_, "GetPowerData"); |
+ ReadSample = (ReadSample_t)GetProcAddress(energy_lib_, "ReadSample"); |
+ |
+ if (IntelEnergyLibInitialize && ReadSample) { |
+ IntelEnergyLibInitialize(); |
+ ReadSample(); |
+ } |
+ } |
+} |
+ |
+PowerSampler::~PowerSampler() { |
+ if (energy_lib_) |
+ FreeLibrary(energy_lib_); |
+} |