blob: 7973f3e7f36b8668da86ada9c16d78a6ed78079f [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SERVICES_DEVICE_COMPUTE_PRESSURE_PRESSURE_MANAGER_IMPL_H_
#define SERVICES_DEVICE_COMPUTE_PRESSURE_PRESSURE_MANAGER_IMPL_H_
#include <map>
#include <memory>
#include "base/containers/flat_map.h"
#include "base/sequence_checker.h"
#include "base/thread_annotations.h"
#include "base/time/time.h"
#include "base/unguessable_token.h"
#include "mojo/public/cpp/bindings/associated_receiver_set.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote_set.h"
#include "services/device/public/mojom/pressure_manager.mojom.h"
#include "services/device/public/mojom/pressure_update.mojom.h"
namespace device {
class ProbesManager;
class VirtualProbesManager;
// Handles the communication between content/browser and services.
//
// This class owns one instance of probe for each PressureSource. The probe
// instance keeps collecting compute pressure information from the
// underlying operating system when its `clients_` is not empty and stops
// collecting when its `clients_` becomes empty.
//
// DeviceService owns one instance of this class.
//
// Instances are not thread-safe and should be used on the same sequence.
class PressureManagerImpl : public mojom::PressureManager {
public:
// The sampling interval must be smaller or equal to the rate-limit for
// observer updates.
static constexpr base::TimeDelta kDefaultSamplingInterval = base::Seconds(1);
// Factory method for production instances.
static std::unique_ptr<PressureManagerImpl> Create(
base::TimeDelta sampling_interval = kDefaultSamplingInterval);
~PressureManagerImpl() override;
PressureManagerImpl(const PressureManagerImpl&) = delete;
PressureManagerImpl& operator=(const PressureManagerImpl&) = delete;
void Bind(mojo::PendingReceiver<mojom::PressureManager> receiver);
// device::mojom::PressureManager implementation.
void AddClient(mojom::PressureSource source,
const std::optional<base::UnguessableToken>& token,
mojo::PendingAssociatedRemote<mojom::PressureClient> client,
AddClientCallback callback) override;
ProbesManager* GetProbesManagerForTesting() const;
private:
friend class PressureManagerImplTest;
explicit PressureManagerImpl(base::TimeDelta sampling_interval);
void AddVirtualPressureSource(
const base::UnguessableToken& token,
mojom::PressureSource source,
mojom::VirtualPressureSourceMetadataPtr metadata,
AddVirtualPressureSourceCallback callback) override;
void RemoveVirtualPressureSource(
const base::UnguessableToken& token,
mojom::PressureSource source,
RemoveVirtualPressureSourceCallback callback) override;
void UpdateVirtualPressureSourceData(
const ::base::UnguessableToken& token,
mojom::PressureSource source,
mojom::PressureState state,
double own_contribution_estimate,
UpdateVirtualPressureSourceDataCallback callback) override;
SEQUENCE_CHECKER(sequence_checker_);
base::TimeDelta sampling_interval_;
mojo::ReceiverSet<mojom::PressureManager> manager_receivers_
GUARDED_BY_CONTEXT(sequence_checker_);
std::unique_ptr<ProbesManager> probes_manager_
GUARDED_BY_CONTEXT(sequence_checker_);
base::flat_map<base::UnguessableToken, std::unique_ptr<VirtualProbesManager>>
virtual_probes_managers_ GUARDED_BY_CONTEXT(sequence_checker_);
};
} // namespace device
#endif // SERVICES_DEVICE_COMPUTE_PRESSURE_PRESSURE_MANAGER_IMPL_H_