Index: third_party/power_gadget/PowerGadgetLib.cpp |
diff --git a/third_party/power_gadget/PowerGadgetLib.cpp b/third_party/power_gadget/PowerGadgetLib.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f154c5325b9606e80819e9980c7f51c96a23b28c |
--- /dev/null |
+++ b/third_party/power_gadget/PowerGadgetLib.cpp |
@@ -0,0 +1,269 @@ |
+// Copyright (c) 2014, Intel Corporation |
+// All rights reserved. |
+// |
+// Redistribution and use in source and binary forms, with or without |
+// modification, are permitted provided that the following conditions are |
+// met: |
+// |
+// * Redistributions of source code must retain the above copyright |
+// notice, this list of conditions and the following disclaimer. |
+// * Redistributions in binary form must reproduce the above |
+// copyright notice, this list of conditions and the following disclaimer |
+// in the documentation and/or other materials provided with the |
+// distribution. |
+// * Neither the name of Intel Corporation nor the names of its |
+// contributors may be used to endorse or promote products derived from |
+// this software without specific prior written permission. |
+// |
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ |
+#include "PowerGadgetLib.h" |
+#include <Windows.h> |
+#include <string> |
+#include <vector> |
+ |
+using namespace std; |
+ |
+string g_lastError; |
+HMODULE g_hModule = NULL; |
+ |
+static bool split(const wstring& s, wstring &path) |
+{ |
+ bool bResult = false; |
+ vector<wstring> output; |
+ |
+ wstring::size_type prev_pos = 0, pos = 0; |
+ |
+ while((pos = s.find(L';', pos)) != wstring::npos) |
+ { |
+ wstring substring( s.substr(prev_pos, pos-prev_pos) ); |
+ if (substring.find(L"Power Gadget 2.") != wstring::npos) |
+ { |
+ path = substring; |
+ bResult = true; |
+ break; |
+ } |
+ prev_pos = ++pos; |
+ } |
+ |
+ if (!bResult) |
+ { |
+ wstring substring(s.substr(prev_pos, pos-prev_pos)); |
+ |
+ if (substring.find(L"Power Gadget 2.") != wstring::npos) |
+ { |
+ path = substring; |
+ bResult = true; |
+ } |
+ } |
+ |
+ if (bResult) |
+ { |
+ basic_string <char>::size_type pos = path.rfind(L" "); |
+ wstring version = path.substr(pos+1, path.length()); |
+ double fVer = _wtof(version.c_str()); |
+ if (fVer > 2.6) |
+ bResult = true; |
+ } |
+ |
+ return bResult; |
+} |
+ |
+static bool GetLibraryLocation(wstring& strLocation) |
+{ |
+ TCHAR *pszPath = _wgetenv(L"IPG_Dir"); |
+ if (pszPath == NULL || wcslen(pszPath) == 0) |
+ return false; |
+ |
+ TCHAR *pszVersion = _wgetenv(L"IPG_Ver"); |
+ if (pszVersion == NULL || wcslen(pszVersion) == 0) |
+ return false; |
+ |
+ int version = _wtof(pszVersion) * 100; |
+ if (version >= 270) |
+ { |
+#if _M_X64 |
+ strLocation = wstring(pszPath) + L"\\EnergyLib64.dll"; |
+#else |
+ strLocation = wstring(pszPath) + L"\\EnergyLib32.dll"; |
+#endif |
+ return true; |
+ } |
+ else |
+ return false; |
+} |
+ |
+CIntelPowerGadgetLib::CIntelPowerGadgetLib(void) : |
+ pInitialize(NULL), |
+ pGetNumNodes(NULL), |
+ pGetMsrName(NULL), |
+ pGetMsrFunc(NULL), |
+ pGetIAFrequency(NULL), |
+ pGetTDP(NULL), |
+ pGetMaxTemperature(NULL), |
+ pGetTemperature(NULL), |
+ pReadSample(NULL), |
+ pGetSysTime(NULL), |
+ pGetRDTSC(NULL), |
+ pGetTimeInterval(NULL), |
+ pGetBaseFrequency(NULL), |
+ pGetPowerData(NULL), |
+ pStartLog(NULL), |
+ pStopLog(NULL), |
+ pGetNumMsrs(NULL) |
+{ |
+ wstring strLocation; |
+ if (GetLibraryLocation(strLocation) == false) |
+ { |
+ g_lastError = "Intel Power Gadget 2.7 or higher not found. If unsure, check if the path is in the user's path environment variable"; |
+ return; |
+ } |
+ |
+ g_hModule = LoadLibrary(strLocation.c_str()); |
+ if (g_hModule == NULL) |
+ { |
+ g_lastError = "LoadLibrary failed"; |
+ return; |
+ } |
+ |
+ pInitialize = (IPGInitialize) GetProcAddress(g_hModule, "IntelEnergyLibInitialize"); |
+ pGetNumNodes = (IPGGetNumNodes) GetProcAddress(g_hModule, "GetNumNodes"); |
+ pGetMsrName = (IPGGetMsrName) GetProcAddress(g_hModule, "GetMsrName"); |
+ pGetMsrFunc = (IPGGetMsrFunc) GetProcAddress(g_hModule, "GetMsrFunc"); |
+ pGetIAFrequency = (IPGGetIAFrequency) GetProcAddress(g_hModule, "GetIAFrequency"); |
+ pGetTDP = (IPGGetTDP) GetProcAddress(g_hModule, "GetTDP"); |
+ pGetMaxTemperature = (IPGGetMaxTemperature) GetProcAddress(g_hModule, "GetMaxTemperature"); |
+ pGetTemperature = (IPGGetTemperature) GetProcAddress(g_hModule, "GetTemperature"); |
+ pReadSample = (IPGReadSample) GetProcAddress(g_hModule, "ReadSample"); |
+ pGetSysTime = (IPGGetSysTime) GetProcAddress(g_hModule, "GetSysTime"); |
+ pGetRDTSC = (IPGGetRDTSC) GetProcAddress(g_hModule, "GetRDTSC"); |
+ pGetTimeInterval = (IPGGetTimeInterval) GetProcAddress(g_hModule, "GetTimeInterval"); |
+ pGetBaseFrequency = (IPGGetBaseFrequency) GetProcAddress(g_hModule, "GetBaseFrequency"); |
+ pGetPowerData = (IPGGetPowerData) GetProcAddress(g_hModule, "GetPowerData"); |
+ pStartLog = (IPGStartLog) GetProcAddress(g_hModule, "StartLog"); |
+ pStopLog = (IPGStopLog) GetProcAddress(g_hModule, "StopLog"); |
+ pGetNumMsrs = (IPGGetNumMsrs) GetProcAddress(g_hModule, "GetNumMsrs"); |
+} |
+ |
+ |
+CIntelPowerGadgetLib::~CIntelPowerGadgetLib(void) |
+{ |
+ if (g_hModule != NULL) |
+ FreeLibrary(g_hModule); |
+} |
+ |
+ |
+ |
+string CIntelPowerGadgetLib::GetLastError() |
+{ |
+ return g_lastError; |
+} |
+ |
+bool CIntelPowerGadgetLib::IntelEnergyLibInitialize(void) |
+{ |
+ if (pInitialize == NULL) |
+ return false; |
+ |
+ bool bSuccess = pInitialize(); |
+ if (!bSuccess) |
+ { |
+ g_lastError = "Initializing the energy library failed"; |
+ return false; |
+ } |
+ |
+ return true; |
+} |
+ |
+ |
+bool CIntelPowerGadgetLib::GetNumNodes(int * nNodes) |
+{ |
+ return pGetNumNodes(nNodes); |
+} |
+ |
+bool CIntelPowerGadgetLib::GetNumMsrs(int * nMsrs) |
+{ |
+ return pGetNumMsrs(nMsrs); |
+} |
+ |
+bool CIntelPowerGadgetLib::GetMsrName(int iMsr, wchar_t *pszName) |
+{ |
+ return pGetMsrName(iMsr, pszName); |
+} |
+ |
+bool CIntelPowerGadgetLib::GetMsrFunc(int iMsr, int *funcID) |
+{ |
+ return pGetMsrFunc(iMsr, funcID); |
+} |
+ |
+bool CIntelPowerGadgetLib::GetIAFrequency(int iNode, int *freqInMHz) |
+{ |
+ return pGetIAFrequency(iNode, freqInMHz); |
+} |
+ |
+bool CIntelPowerGadgetLib::GetTDP(int iNode, double *TDP) |
+{ |
+ return pGetTDP(iNode, TDP); |
+} |
+ |
+bool CIntelPowerGadgetLib::GetMaxTemperature(int iNode, int *degreeC) |
+{ |
+ return pGetMaxTemperature(iNode, degreeC); |
+} |
+ |
+bool CIntelPowerGadgetLib::GetTemperature(int iNode, int *degreeC) |
+{ |
+ return pGetTemperature(iNode, degreeC); |
+} |
+ |
+bool CIntelPowerGadgetLib::ReadSample() |
+{ |
+ bool bSuccess = pReadSample(); |
+ if (bSuccess == false) |
+ g_lastError = "MSR overflowed. You can safely discard this sample"; |
+ return bSuccess; |
+} |
+ |
+bool CIntelPowerGadgetLib::GetSysTime(SYSTEMTIME *sysTime) |
+{ |
+ return pGetSysTime(sysTime); |
+} |
+ |
+bool CIntelPowerGadgetLib::GetRDTSC(UINT64 *TSC) |
+{ |
+ return pGetRDTSC(TSC); |
+} |
+ |
+bool CIntelPowerGadgetLib::GetTimeInterval(double *offset) |
+{ |
+ return pGetTimeInterval(offset); |
+} |
+ |
+bool CIntelPowerGadgetLib::GetBaseFrequency(int iNode, double *baseFrequency) |
+{ |
+ return pGetBaseFrequency(iNode, baseFrequency); |
+} |
+ |
+bool CIntelPowerGadgetLib::GetPowerData(int iNode, int iMSR, double *results, int *nResult) |
+{ |
+ return pGetPowerData(iNode, iMSR, results, nResult); |
+} |
+ |
+bool CIntelPowerGadgetLib::StartLog(wchar_t *szFilename) |
+{ |
+ return pStartLog(szFilename); |
+} |
+ |
+bool CIntelPowerGadgetLib::StopLog() |
+{ |
+ return pStopLog(); |
+} |