diff options
Diffstat (limited to 'chromium/third_party/power_gadget/PowerGadgetLib.cpp')
-rw-r--r-- | chromium/third_party/power_gadget/PowerGadgetLib.cpp | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/chromium/third_party/power_gadget/PowerGadgetLib.cpp b/chromium/third_party/power_gadget/PowerGadgetLib.cpp new file mode 100644 index 00000000000..f154c5325b9 --- /dev/null +++ b/chromium/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(); +} |