[go: nahoru, domu]

blob: 3c8afea62ea6ad7e49dad7f6ca183976449e676a [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_POWER_METRICS_SYSTEM_POWER_MONITOR_H_
#define COMPONENTS_POWER_METRICS_SYSTEM_POWER_MONITOR_H_
#include <memory>
#include <vector>
#include "base/threading/sequence_bound.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "base/trace_event/trace_log.h"
#include "components/power_metrics/energy_metrics_provider.h"
namespace power_metrics {
// A delegate to isolate System Power Monitor functionality mainly for
// testing.
class SystemPowerMonitorDelegate {
public:
SystemPowerMonitorDelegate();
SystemPowerMonitorDelegate(const SystemPowerMonitorDelegate&) = delete;
SystemPowerMonitorDelegate& operator=(const SystemPowerMonitorDelegate&) =
delete;
virtual ~SystemPowerMonitorDelegate();
// Emits trace counter. The metric string stands for trace counter name,
// timestamp is the counter timestamp, power is the corresponding counter
// value of system power consumption in units of milliwatts.
virtual void RecordSystemPower(const char* metric,
base::TimeTicks timestamp,
int64_t power);
// Returns whether the tracing category is enabled to determine if we should
// record.
virtual bool IsTraceCategoryEnabled() const;
};
// Manages a timer to regularly sample and emit trace events, whose start and
// stop are controlled by System Power Monitor.
class SystemPowerMonitorHelper {
public:
// Default sampling interval, which should be set to larger or equal to 50 ms.
static constexpr base::TimeDelta kDefaultSampleInterval =
base::Milliseconds(50);
SystemPowerMonitorHelper(
std::unique_ptr<EnergyMetricsProvider> provider,
std::unique_ptr<SystemPowerMonitorDelegate> delegate);
SystemPowerMonitorHelper(const SystemPowerMonitorHelper&) = delete;
SystemPowerMonitorHelper& operator=(const SystemPowerMonitorHelper&) = delete;
~SystemPowerMonitorHelper();
void Start();
void Stop();
void Sample();
bool IsTimerRunningForTesting();
private:
std::vector<const char*> valid_metrics_;
EnergyMetricsProvider::EnergyMetrics last_sample_;
base::TimeTicks last_timestamp_;
base::RepeatingTimer timer_;
// Used to derive instant system energy metrics.
std::unique_ptr<EnergyMetricsProvider> provider_;
std::unique_ptr<SystemPowerMonitorDelegate> delegate_;
};
// Monitors system-wide power consumption. Gets data from EnergyMetricsProvider.
class SystemPowerMonitor
: public base::trace_event::TraceLog::EnabledStateObserver {
public:
SystemPowerMonitor();
SystemPowerMonitor(const SystemPowerMonitor&) = delete;
SystemPowerMonitor& operator=(const SystemPowerMonitor&) = delete;
~SystemPowerMonitor() override;
static SystemPowerMonitor* GetInstance();
// TraceLog::EnabledStateObserver.
void OnTraceLogEnabled() override;
void OnTraceLogDisabled() override;
private:
friend class SystemPowerMonitorTest;
SystemPowerMonitor(std::unique_ptr<EnergyMetricsProvider> provider,
std::unique_ptr<SystemPowerMonitorDelegate> delegate);
base::SequenceBound<SystemPowerMonitorHelper>* GetHelperForTesting();
base::SequenceBound<SystemPowerMonitorHelper> helper_;
};
} // namespace power_metrics
#endif // COMPONENTS_POWER_METRICS_SYSTEM_POWER_MONITOR_H_