#ifndef BASE_TRACE_EVENT_CPUFREQ_MONITOR_ANDROID_H_
#define BASE_TRACE_EVENT_CPUFREQ_MONITOR_ANDROID_H_
#include <atomic>
#include "base/base_export.h"
#include "base/files/scoped_file.h"
#include "base/memory/scoped_refptr.h"
#include "base/trace_event/trace_log.h"
namespace base {
class SingleThreadTaskRunner;
namespace trace_event {
class BASE_EXPORT CPUFreqMonitorDelegate {
public:
CPUFreqMonitorDelegate();
CPUFreqMonitorDelegate(const CPUFreqMonitorDelegate&) = delete;
CPUFreqMonitorDelegate& operator=(const CPUFreqMonitorDelegate&) = delete;
virtual ~CPUFreqMonitorDelegate() = default;
virtual void GetCPUIds(std::vector<unsigned int>* ids) const;
virtual unsigned int GetKernelMaxCPUs() const;
virtual void RecordFrequency(unsigned int cpu_id, unsigned int freq);
virtual bool IsTraceCategoryEnabled() const;
virtual std::string GetScalingCurFreqPathString(unsigned int cpu_id) const;
virtual std::string GetRelatedCPUsPathString(unsigned int cpu_id) const;
virtual scoped_refptr<SingleThreadTaskRunner> CreateTaskRunner();
};
class BASE_EXPORT CPUFreqMonitor : public TraceLog::EnabledStateObserver {
public:
static const size_t kDefaultCPUFreqSampleIntervalMs = 50;
CPUFreqMonitor();
CPUFreqMonitor(const CPUFreqMonitor&) = delete;
CPUFreqMonitor& operator=(const CPUFreqMonitor&) = delete;
~CPUFreqMonitor() override;
static CPUFreqMonitor* GetInstance();
void Start();
void Stop();
void OnTraceLogEnabled() override;
void OnTraceLogDisabled() override;
bool IsEnabledForTesting();
private:
friend class CPUFreqMonitorTest;
CPUFreqMonitor(std::unique_ptr<CPUFreqMonitorDelegate> delegate);
void Sample(std::vector<std::pair<unsigned int, base::ScopedFD>> fds);
const scoped_refptr<SingleThreadTaskRunner>& GetOrCreateTaskRunner();
std::atomic<bool> is_enabled_{false};
scoped_refptr<SingleThreadTaskRunner> task_runner_;
std::unique_ptr<CPUFreqMonitorDelegate> delegate_;
base::WeakPtrFactory<CPUFreqMonitor> weak_ptr_factory_{this};
};
}
}
#endif