11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef CHROME_BROWSER_POWER_PROCESS_POWER_COLLECTOR_H_ 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define CHROME_BROWSER_POWER_PROCESS_POWER_COLLECTOR_H_ 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <map> 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/linked_ptr.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/process/process_handle.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/process/process_metrics.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/timer/timer.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/power/origin_power_map_factory.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "url/gurl.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_CHROMEOS) 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromeos/dbus/power_manager_client.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass Profile; 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace content { 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass RenderProcessHost; 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_CHROMEOS) 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace power_manager { 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass PowerSupplyProperties; 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Manages regular updates of the profile power consumption. 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ProcessPowerCollector 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_CHROMEOS) 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : public chromeos::PowerManagerClient::Observer 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci class PerProcessData { 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PerProcessData(scoped_ptr<base::ProcessMetrics> metrics, 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& origin, 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Profile* profile); 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PerProcessData(); 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ~PerProcessData(); 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::ProcessMetrics* metrics() const { return metrics_.get(); } 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Profile* profile() const { return profile_; } 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL last_origin() const { return last_origin_; } 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int last_cpu_percent() const { return last_cpu_percent_; } 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool seen_this_cycle() const { return seen_this_cycle_; } 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void set_last_cpu_percent(double new_cpu) { last_cpu_percent_ = new_cpu; } 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void set_seen_this_cycle(bool seen) { seen_this_cycle_ = seen; } 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |metrics_| holds the ProcessMetrics information for the given process. 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<base::ProcessMetrics> metrics_; 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |profile| is the profile that is visiting the |last_origin_|. 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // It is not owned by PerProcessData. 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Profile* profile_; 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |last_origin_| is the last origin visited by the process. 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL last_origin_; 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |last_cpu_percent_| is the proportion of the CPU used since the last 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // query. 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci double last_cpu_percent_; 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |seen_this_cycle| represents if the process still exists in this cycle. 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If it doesn't, we erase the PerProcessData. 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool seen_this_cycle_; 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(PerProcessData); 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // A map from all process handles to a metric. 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef std::map<base::ProcessHandle, linked_ptr<PerProcessData> > 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProcessMetricsMap; 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // A callback used to define mock CPU usage for testing. 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef base::Callback<double(base::ProcessHandle)> CpuUsageCallback; 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // On Chrome OS, can only be initialized after the DBusThreadManager has been 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // initialized. 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProcessPowerCollector(); 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // On Chrome OS, can only be destroyed before DBusThreadManager is. 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~ProcessPowerCollector(); 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void set_cpu_usage_callback_for_testing(const CpuUsageCallback& callback) { 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cpu_usage_callback_ = callback; 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProcessMetricsMap* metrics_map_for_testing() { return &metrics_map_; } 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_CHROMEOS) 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // PowerManagerClient::Observer implementation: 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void PowerChanged( 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const power_manager::PowerSupplyProperties& prop) OVERRIDE; 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Begin periodically updating the power consumption numbers by profile. 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void Initialize(); 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Calls UpdatePowerConsumption() and returns the total CPU percent. 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci double UpdatePowerConsumptionForTesting(); 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Starts the timer for updating the power consumption. 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void StartTimer(); 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Calls SynchronizerProcesses() and RecordCpuUsageByOrigin() to update the 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |metrics_map_| and attribute power consumption. Invoked by |timer_| and as 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // a helper method for UpdatePowerConsumptionForTesting(). 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci double UpdatePowerConsumption(); 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Calls UpdatePowerConsumption(). Invoked by |timer_|. 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void HandleUpdateTimeout(); 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Synchronizes the currently active processes to the |metrics_map_| and 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // returns the total amount of cpu usage in the cycle. 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci double SynchronizeProcesses(); 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Attributes the power usage to the profiles and origins using the 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // information from SynchronizeProcesses() given a total amount 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // of CPU used in this cycle, |total_cpu_percent|. 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void RecordCpuUsageByOrigin(double total_cpu_percent); 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Adds the information from a given RenderProcessHost to the |metrics_map_| 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // for a given origin. Called by SynchronizeProcesses(). 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void UpdateProcessInMap(const content::RenderProcessHost* render_process, 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& origin); 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProcessMetricsMap metrics_map_; 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::RepeatingTimer<ProcessPowerCollector> timer_; 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Callback to use to get CPU usage if set. 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CpuUsageCallback cpu_usage_callback_; 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The factor to scale the CPU usage by. 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci double scale_factor_; 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(ProcessPowerCollector); 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // CHROME_BROWSER_POWER_PROCESS_POWER_COLLECTOR_H_ 147