[M120 Migration][VD] Enable direct rendering for TVPlus
[platform/framework/web/chromium-efl.git] / components / power_metrics / system_power_monitor.h
1 // Copyright 2023 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef COMPONENTS_POWER_METRICS_SYSTEM_POWER_MONITOR_H_
6 #define COMPONENTS_POWER_METRICS_SYSTEM_POWER_MONITOR_H_
7
8 #include <memory>
9 #include <vector>
10
11 #include "base/threading/sequence_bound.h"
12 #include "base/time/time.h"
13 #include "base/timer/timer.h"
14 #include "base/trace_event/trace_log.h"
15 #include "components/power_metrics/energy_metrics_provider.h"
16
17 namespace power_metrics {
18
19 // A delegate to isolate System Power Monitor functionality mainly for
20 // testing.
21 class SystemPowerMonitorDelegate {
22  public:
23   SystemPowerMonitorDelegate();
24
25   SystemPowerMonitorDelegate(const SystemPowerMonitorDelegate&) = delete;
26   SystemPowerMonitorDelegate& operator=(const SystemPowerMonitorDelegate&) =
27       delete;
28
29   virtual ~SystemPowerMonitorDelegate();
30
31   // Emits trace counter. The metric string stands for trace counter name,
32   // timestamp is the counter timestamp, power is the corresponding counter
33   // value of system power consumption in units of milliwatts.
34   virtual void RecordSystemPower(const char* metric,
35                                  base::TimeTicks timestamp,
36                                  int64_t power);
37
38   // Returns whether the tracing category is enabled to determine if we should
39   // record.
40   virtual bool IsTraceCategoryEnabled() const;
41 };
42
43 // Manages a timer to regularly sample and emit trace events, whose start and
44 // stop are controlled by System Power Monitor.
45 class SystemPowerMonitorHelper {
46  public:
47   // Default sampling interval, which should be set to larger or equal to 50 ms.
48   static constexpr base::TimeDelta kDefaultSampleInterval =
49       base::Milliseconds(50);
50
51   SystemPowerMonitorHelper(
52       std::unique_ptr<EnergyMetricsProvider> provider,
53       std::unique_ptr<SystemPowerMonitorDelegate> delegate);
54
55   SystemPowerMonitorHelper(const SystemPowerMonitorHelper&) = delete;
56   SystemPowerMonitorHelper& operator=(const SystemPowerMonitorHelper&) = delete;
57
58   ~SystemPowerMonitorHelper();
59
60   void Start();
61   void Stop();
62   void Sample();
63
64   bool IsTimerRunningForTesting();
65
66  private:
67   std::vector<const char*> valid_metrics_;
68   EnergyMetricsProvider::EnergyMetrics last_sample_;
69   base::TimeTicks last_timestamp_;
70   base::RepeatingTimer timer_;
71
72   // Used to derive instant system energy metrics.
73   std::unique_ptr<EnergyMetricsProvider> provider_;
74   std::unique_ptr<SystemPowerMonitorDelegate> delegate_;
75 };
76
77 // Monitors system-wide power consumption. Gets data from EnergyMetricsProvider.
78 class SystemPowerMonitor
79     : public base::trace_event::TraceLog::EnabledStateObserver {
80  public:
81   SystemPowerMonitor();
82
83   SystemPowerMonitor(const SystemPowerMonitor&) = delete;
84   SystemPowerMonitor& operator=(const SystemPowerMonitor&) = delete;
85
86   ~SystemPowerMonitor() override;
87
88   static SystemPowerMonitor* GetInstance();
89
90   // TraceLog::EnabledStateObserver.
91   void OnTraceLogEnabled() override;
92   void OnTraceLogDisabled() override;
93
94  private:
95   friend class SystemPowerMonitorTest;
96
97   SystemPowerMonitor(std::unique_ptr<EnergyMetricsProvider> provider,
98                      std::unique_ptr<SystemPowerMonitorDelegate> delegate);
99
100   base::SequenceBound<SystemPowerMonitorHelper>* GetHelperForTesting();
101
102   base::SequenceBound<SystemPowerMonitorHelper> helper_;
103 };
104
105 }  // namespace power_metrics
106
107 #endif  // COMPONENTS_POWER_METRICS_SYSTEM_POWER_MONITOR_H_