cpufreq_monitor_android.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef BASE_TRACE_EVENT_CPUFREQ_MONITOR_ANDROID_H_
  5. #define BASE_TRACE_EVENT_CPUFREQ_MONITOR_ANDROID_H_
  6. #include <atomic>
  7. #include "base/base_export.h"
  8. #include "base/files/scoped_file.h"
  9. #include "base/memory/scoped_refptr.h"
  10. #include "base/trace_event/trace_log.h"
  11. namespace base {
  12. class SingleThreadTaskRunner;
  13. namespace trace_event {
  14. // A delegate to isolate CPU frequency monitor functionality mainly for testing.
  15. class BASE_EXPORT CPUFreqMonitorDelegate {
  16. public:
  17. CPUFreqMonitorDelegate();
  18. CPUFreqMonitorDelegate(const CPUFreqMonitorDelegate&) = delete;
  19. CPUFreqMonitorDelegate& operator=(const CPUFreqMonitorDelegate&) = delete;
  20. virtual ~CPUFreqMonitorDelegate() = default;
  21. // Returns a vector of the minimal set of CPU IDs that we need to monitor to
  22. // get CPU frequency information. For CPUs that operate cores in a cluster,
  23. // i.e. modern Qualcomm 8 cores, this is CPU0 and CPU4.
  24. virtual void GetCPUIds(std::vector<unsigned int>* ids) const;
  25. // Reads the kernel_max_cpu file to determine the max CPU ID, i.e. 7 on an
  26. // 8-core CPU.
  27. virtual unsigned int GetKernelMaxCPUs() const;
  28. // Reads the frequency from the CPUs being monitored and records them.
  29. virtual void RecordFrequency(unsigned int cpu_id, unsigned int freq);
  30. // Returns whether or not the tracing category our CPU Frequency counters are
  31. // in is enabled to determine if we should record.
  32. virtual bool IsTraceCategoryEnabled() const;
  33. // Gets the path to CPU frequency related files for a particular CPU ID.
  34. virtual std::string GetScalingCurFreqPathString(unsigned int cpu_id) const;
  35. virtual std::string GetRelatedCPUsPathString(unsigned int cpu_id) const;
  36. // Allows us to delay creating a task runner, necessary because many tests
  37. // don't like us creating one outside of a TaskEnvironment.
  38. virtual scoped_refptr<SingleThreadTaskRunner> CreateTaskRunner();
  39. };
  40. // A class for monitoring the CPU frequency on unique cores/clusters.
  41. class BASE_EXPORT CPUFreqMonitor : public TraceLog::EnabledStateObserver {
  42. public:
  43. // Overhead of reading one cluster on a Nexus 6P is ~0.1ms per CPU. 50ms seems
  44. // frequent enough to get a general idea of CPU frequency trends.
  45. static const size_t kDefaultCPUFreqSampleIntervalMs = 50;
  46. CPUFreqMonitor();
  47. CPUFreqMonitor(const CPUFreqMonitor&) = delete;
  48. CPUFreqMonitor& operator=(const CPUFreqMonitor&) = delete;
  49. ~CPUFreqMonitor() override;
  50. static CPUFreqMonitor* GetInstance();
  51. void Start();
  52. void Stop();
  53. // TraceLog::EnabledStateObserver.
  54. void OnTraceLogEnabled() override;
  55. void OnTraceLogDisabled() override;
  56. bool IsEnabledForTesting();
  57. private:
  58. friend class CPUFreqMonitorTest;
  59. CPUFreqMonitor(std::unique_ptr<CPUFreqMonitorDelegate> delegate);
  60. void Sample(std::vector<std::pair<unsigned int, base::ScopedFD>> fds);
  61. // Uses the delegate's CreateTaskRunner function to lazily create a task
  62. // runner so we don't illegally create a task runner on Chrome startup for
  63. // various tests.
  64. const scoped_refptr<SingleThreadTaskRunner>& GetOrCreateTaskRunner();
  65. std::atomic<bool> is_enabled_{false};
  66. scoped_refptr<SingleThreadTaskRunner> task_runner_;
  67. std::unique_ptr<CPUFreqMonitorDelegate> delegate_;
  68. base::WeakPtrFactory<CPUFreqMonitor> weak_ptr_factory_{this};
  69. };
  70. } // namespace trace_event
  71. } // namespace base
  72. #endif // BASE_TRACE_EVENT_CPUFREQ_MONITOR_ANDROID_H_