chromium/tools/win/IdleWakeups/power_sampler.h

// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef TOOLS_WIN_IDLEWAKEUPS_POWER_SAMPLER_H_
#define TOOLS_WIN_IDLEWAKEUPS_POWER_SAMPLER_H_

#include <windows.h>

#include <map>
#include <string>

// https://software.intel.com/en-us/blogs/2012/12/13/using-the-intel-power-gadget-api-on-mac-os-x
typedef int (*IntelEnergyLibInitialize_t)();
typedef int (*GetNumMsrs_t)(int* nMsr);
typedef int (*GetMsrName_t)(int iMsr, wchar_t* szName);
typedef int (*GetMsrFunc_t)(int iMsr, int* pFuncID);
typedef int (*GetPowerData_t)(int iNode,
                              int iMsr,
                              double* pResult,
                              int* nResult);
typedef int (*ReadSample_t)();

class PowerSampler {
 public:
  PowerSampler();
  ~PowerSampler();

  void SampleCPUPowerState();

  double get_power(std::wstring key) { return power_[key]; }

 private:
  // Power consumed in mWh since the last sample.
  std::map<std::wstring, double> power_;

  HMODULE energy_lib_ = nullptr;
  IntelEnergyLibInitialize_t IntelEnergyLibInitialize = nullptr;
  GetNumMsrs_t GetNumMsrs = nullptr;
  GetMsrName_t GetMsrName = nullptr;
  GetMsrFunc_t GetMsrFunc = nullptr;
  GetPowerData_t GetPowerData = nullptr;
  ReadSample_t ReadSample = nullptr;

  PowerSampler& operator=(const PowerSampler&) = delete;
  PowerSampler(const PowerSampler&) = delete;
};

#endif  // TOOLS_WIN_IDLEWAKEUPS_POWER_SAMPLER_H_