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