#ifndef SERVICES_DEVICE_COMPUTE_PRESSURE_PRESSURE_MANAGER_IMPL_H_
#define SERVICES_DEVICE_COMPUTE_PRESSURE_PRESSURE_MANAGER_IMPL_H_
#include <map>
#include <memory>
#include "base/sequence_checker.h"
#include "base/thread_annotations.h"
#include "base/time/time.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 CpuProbe;
class PressureManagerImpl : public mojom::PressureManager {
public:
static constexpr base::TimeDelta kDefaultSamplingInterval = base::Seconds(1);
static std::unique_ptr<PressureManagerImpl> Create();
~PressureManagerImpl() override;
PressureManagerImpl(const PressureManagerImpl&) = delete;
PressureManagerImpl& operator=(const PressureManagerImpl&) = delete;
void Bind(mojo::PendingReceiver<mojom::PressureManager> receiver);
void AddClient(mojo::PendingRemote<mojom::PressureClient> client,
mojom::PressureSource source,
AddClientCallback callback) override;
void SetCpuProbeForTesting(std::unique_ptr<CpuProbe>);
private:
friend class PressureManagerImplTest;
explicit PressureManagerImpl(base::TimeDelta sampling_interval);
void UpdateClients(mojom::PressureSource source, mojom::PressureState state);
void OnClientRemoteDisconnected(mojom::PressureSource source,
mojo::RemoteSetElementId );
SEQUENCE_CHECKER(sequence_checker_);
std::unique_ptr<CpuProbe> cpu_probe_ GUARDED_BY_CONTEXT(sequence_checker_);
mojo::ReceiverSet<mojom::PressureManager> receivers_
GUARDED_BY_CONTEXT(sequence_checker_);
std::map<mojom::PressureSource, mojo::RemoteSet<mojom::PressureClient>>
clients_ GUARDED_BY_CONTEXT(sequence_checker_);
};
}
#endif