| Index: chrome/browser/power/process_power_collector.h
|
| diff --git a/chrome/browser/power/process_power_collector.h b/chrome/browser/power/process_power_collector.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b172a8fdca45b8f1210e5dde49e3242a44d6dd2f
|
| --- /dev/null
|
| +++ b/chrome/browser/power/process_power_collector.h
|
| @@ -0,0 +1,146 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef CHROME_BROWSER_POWER_PROCESS_POWER_COLLECTOR_H_
|
| +#define CHROME_BROWSER_POWER_PROCESS_POWER_COLLECTOR_H_
|
| +
|
| +#include <map>
|
| +
|
| +#include "base/memory/linked_ptr.h"
|
| +#include "base/process/process_handle.h"
|
| +#include "base/process/process_metrics.h"
|
| +#include "base/timer/timer.h"
|
| +#include "components/power/origin_power_map_factory.h"
|
| +#include "url/gurl.h"
|
| +
|
| +#if defined(OS_CHROMEOS)
|
| +#include "chromeos/dbus/power_manager_client.h"
|
| +#endif
|
| +
|
| +class Profile;
|
| +
|
| +namespace content {
|
| +class RenderProcessHost;
|
| +}
|
| +
|
| +#if defined(OS_CHROMEOS)
|
| +namespace power_manager {
|
| +class PowerSupplyProperties;
|
| +}
|
| +#endif
|
| +
|
| +// Manages regular updates of the profile power consumption.
|
| +class ProcessPowerCollector
|
| +#if defined(OS_CHROMEOS)
|
| + : public chromeos::PowerManagerClient::Observer
|
| +#endif
|
| + {
|
| + public:
|
| + class PerProcessData {
|
| + public:
|
| + PerProcessData(scoped_ptr<base::ProcessMetrics> metrics,
|
| + const GURL& origin,
|
| + Profile* profile);
|
| + PerProcessData();
|
| + ~PerProcessData();
|
| +
|
| + base::ProcessMetrics* metrics() const { return metrics_.get(); }
|
| + Profile* profile() const { return profile_; }
|
| + GURL last_origin() const { return last_origin_; }
|
| + int last_cpu_percent() const { return last_cpu_percent_; }
|
| + bool seen_this_cycle() const { return seen_this_cycle_; }
|
| + void set_last_cpu_percent(double new_cpu) { last_cpu_percent_ = new_cpu; }
|
| + void set_seen_this_cycle(bool seen) { seen_this_cycle_ = seen; }
|
| +
|
| + private:
|
| + // |metrics_| holds the ProcessMetrics information for the given process.
|
| + scoped_ptr<base::ProcessMetrics> metrics_;
|
| +
|
| + // |profile| is the profile that is visiting the |last_origin_|.
|
| + // It is not owned by PerProcessData.
|
| + Profile* profile_;
|
| +
|
| + // |last_origin_| is the last origin visited by the process.
|
| + GURL last_origin_;
|
| +
|
| + // |last_cpu_percent_| is the proportion of the CPU used since the last
|
| + // query.
|
| + double last_cpu_percent_;
|
| +
|
| + // |seen_this_cycle| represents if the process still exists in this cycle.
|
| + // If it doesn't, we erase the PerProcessData.
|
| + bool seen_this_cycle_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(PerProcessData);
|
| + };
|
| +
|
| + // A map from all process handles to a metric.
|
| + typedef std::map<base::ProcessHandle, linked_ptr<PerProcessData> >
|
| + ProcessMetricsMap;
|
| + // A callback used to define mock CPU usage for testing.
|
| + typedef base::Callback<double(base::ProcessHandle)> CpuUsageCallback;
|
| +
|
| + // On Chrome OS, can only be initialized after the DBusThreadManager has been
|
| + // initialized.
|
| + ProcessPowerCollector();
|
| + // On Chrome OS, can only be destroyed before DBusThreadManager is.
|
| + virtual ~ProcessPowerCollector();
|
| +
|
| + void set_cpu_usage_callback_for_testing(const CpuUsageCallback& callback) {
|
| + cpu_usage_callback_ = callback;
|
| + }
|
| +
|
| + ProcessMetricsMap* metrics_map_for_testing() { return &metrics_map_; }
|
| +
|
| +#if defined(OS_CHROMEOS)
|
| + // PowerManagerClient::Observer implementation:
|
| + virtual void PowerChanged(
|
| + const power_manager::PowerSupplyProperties& prop) OVERRIDE;
|
| +#endif
|
| +
|
| + // Begin periodically updating the power consumption numbers by profile.
|
| + void Initialize();
|
| +
|
| + // Calls UpdatePowerConsumption() and returns the total CPU percent.
|
| + double UpdatePowerConsumptionForTesting();
|
| +
|
| + private:
|
| + // Starts the timer for updating the power consumption.
|
| + void StartTimer();
|
| +
|
| + // Calls SynchronizerProcesses() and RecordCpuUsageByOrigin() to update the
|
| + // |metrics_map_| and attribute power consumption. Invoked by |timer_| and as
|
| + // a helper method for UpdatePowerConsumptionForTesting().
|
| + double UpdatePowerConsumption();
|
| +
|
| + // Calls UpdatePowerConsumption(). Invoked by |timer_|.
|
| + void HandleUpdateTimeout();
|
| +
|
| + // Synchronizes the currently active processes to the |metrics_map_| and
|
| + // returns the total amount of cpu usage in the cycle.
|
| + double SynchronizeProcesses();
|
| +
|
| + // Attributes the power usage to the profiles and origins using the
|
| + // information from SynchronizeProcesses() given a total amount
|
| + // of CPU used in this cycle, |total_cpu_percent|.
|
| + void RecordCpuUsageByOrigin(double total_cpu_percent);
|
| +
|
| + // Adds the information from a given RenderProcessHost to the |metrics_map_|
|
| + // for a given origin. Called by SynchronizeProcesses().
|
| + void UpdateProcessInMap(const content::RenderProcessHost* render_process,
|
| + const GURL& origin);
|
| +
|
| + ProcessMetricsMap metrics_map_;
|
| + base::RepeatingTimer<ProcessPowerCollector> timer_;
|
| +
|
| + // Callback to use to get CPU usage if set.
|
| + CpuUsageCallback cpu_usage_callback_;
|
| +
|
| + // The factor to scale the CPU usage by.
|
| + double scale_factor_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ProcessPowerCollector);
|
| +};
|
| +
|
| +#endif // CHROME_BROWSER_POWER_PROCESS_POWER_COLLECTOR_H_
|
|
|