blob: c87e8aa52b43dee84883b1dae7098f78bccdd0d4 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_METRICS_POWER_COALITION_RESOURCE_USAGE_PROVIDER_MAC_H_
#define CHROME_BROWSER_METRICS_POWER_COALITION_RESOURCE_USAGE_PROVIDER_MAC_H_
#include <mach/mach_time.h>
#include <stdint.h>
#include <vector>
#include "base/dcheck_is_on.h"
#include "base/gtest_prod_util.h"
#include "base/time/time.h"
#include "components/power_metrics/energy_impact_mac.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace power_metrics {
struct CoalitionResourceUsageRate;
}
struct coalition_resource_usage;
// Provides resource usage rate for the current process' coalition over "short"
// and "long" intervals.
//
// Init() must be invoked before any other method. It starts a "long" interval.
// After that, StartShortInterval() and EndInterval() should be invoked in
// alternance to start a "short" interval, end both intervals and start a new
// "long" interval:
//
// | Long | Long | Long |
// | Short | | Short | | Short |
// Init SSI EI SSI EI SSI EI
//
// SSI = StartShortInterval
// EI = EndIntervals
//
// See //components/power_metrics/resource_coalition_mac.h for more details
// about resource coalitions.
//
// NOTE: Chrome could belong to a non-empty coalition if it's started from a
// terminal, in which case the data will be hard to interpret. This class
// reports that the coalition data isn't available when it's the case.
class CoalitionResourceUsageProvider {
public:
CoalitionResourceUsageProvider();
virtual ~CoalitionResourceUsageProvider();
// Initializes the coalition resource usage id. Reports whether it is
// available to UMA. Starts a "long" interval. Must be invoked once
// before any other method.
void Init();
// Starts a "short" interval.
void StartShortInterval();
// Ends the current "short" and "long" intervals. Returns the resource usage
// rate for these intervals via arguments (or nullopt if not available).
// Starts a new "long" interval.
void EndIntervals(absl::optional<power_metrics::CoalitionResourceUsageRate>*
short_interval_resource_usage_rate,
absl::optional<power_metrics::CoalitionResourceUsageRate>*
long_interval_resource_usage_rate);
protected:
// Used to convert `coalition_resource_usage` time fields from
// `mach_absolute_time` units to ns.
mach_timebase_info_data_t timebase_;
// If true, uses the coalition id even if the process is in the same coalition
// as its parent.
bool ignore_not_alone_for_testing_ = false;
private:
// Virtual for testing.
virtual std::unique_ptr<coalition_resource_usage> GetCoalitionResourceUsage(
int64_t coalition_id);
#if DCHECK_IS_ON()
bool initialized_ = false;
#endif
// Coalition ID for the current process or nullopt if not available.
absl::optional<uint64_t> coalition_id_;
// Coefficients to compute Energy Impact from a `coalition_resource_usage`.
const absl::optional<power_metrics::EnergyImpactCoefficients>
energy_impact_coefficients_;
// Start time of the current "long" interval.
base::TimeTicks long_interval_begin_time_;
// Sample collected at the beginning of the current "long" interval.
std::unique_ptr<coalition_resource_usage> long_interval_begin_sample_;
// Start time of the current "short" interval.
base::TimeTicks short_interval_begin_time_;
// Sample collected at the beginning of the current "short" interval.
std::unique_ptr<coalition_resource_usage> short_interval_begin_sample_;
};
#endif // CHROME_BROWSER_METRICS_POWER_COALITION_RESOURCE_USAGE_PROVIDER_MAC_H_