blob: 649cfbc5b9c9913d30d3b8261ae206ffe30337d8 [file] [log] [blame]
// Copyright 2017 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 SERVICES_RESOURCE_COORDINATOR_COORDINATION_UNIT_COORDINATION_UNIT_GRAPH_H_
#define SERVICES_RESOURCE_COORDINATOR_COORDINATION_UNIT_COORDINATION_UNIT_GRAPH_H_
#include <stdint.h>
#include <memory>
#include <unordered_map>
#include <vector>
#include "base/macros.h"
#include "base/process/process_handle.h"
#include "services/metrics/public/cpp/mojo_ukm_recorder.h"
#include "services/metrics/public/cpp/ukm_recorder.h"
#include "services/resource_coordinator/public/cpp/coordination_unit_id.h"
#include "services/resource_coordinator/public/cpp/coordination_unit_types.h"
#include "services/service_manager/public/cpp/service_context_ref.h"
namespace service_manager {
template <typename... BinderArgs>
class BinderRegistryWithArgs;
struct BindSourceInfo;
class ServiceContextRefFactory;
} // namespace service_manager
namespace resource_coordinator {
class CoordinationUnitBase;
class CoordinationUnitGraphObserver;
class CoordinationUnitProviderImpl;
class FrameCoordinationUnitImpl;
class PageCoordinationUnitImpl;
class ProcessCoordinationUnitImpl;
class SystemCoordinationUnitImpl;
// The CoordinationUnitGraph represents a graph of the coordination units
// representing a single system. It vends out new instances of coordination
// units and indexes them by ID. It also fires the creation and pre-destruction
// notifications for all coordination units.
class CoordinationUnitGraph {
public:
CoordinationUnitGraph();
~CoordinationUnitGraph();
void set_ukm_recorder(ukm::UkmRecorder* ukm_recorder) {
ukm_recorder_ = ukm_recorder;
}
ukm::UkmRecorder* ukm_recorder() const { return ukm_recorder_; }
void OnStart(service_manager::BinderRegistryWithArgs<
const service_manager::BindSourceInfo&>* registry,
service_manager::ServiceContextRefFactory* service_ref_factory);
void RegisterObserver(
std::unique_ptr<CoordinationUnitGraphObserver> observer);
void OnCoordinationUnitCreated(CoordinationUnitBase* coordination_unit);
void OnBeforeCoordinationUnitDestroyed(
CoordinationUnitBase* coordination_unit);
FrameCoordinationUnitImpl* CreateFrameCoordinationUnit(
const CoordinationUnitID& id,
std::unique_ptr<service_manager::ServiceContextRef> service_ref);
PageCoordinationUnitImpl* CreatePageCoordinationUnit(
const CoordinationUnitID& id,
std::unique_ptr<service_manager::ServiceContextRef> service_ref);
ProcessCoordinationUnitImpl* CreateProcessCoordinationUnit(
const CoordinationUnitID& id,
std::unique_ptr<service_manager::ServiceContextRef> service_ref);
SystemCoordinationUnitImpl* FindOrCreateSystemCoordinationUnit(
std::unique_ptr<service_manager::ServiceContextRef> service_ref);
// Search functions for type and ID queries.
std::vector<CoordinationUnitBase*> GetCoordinationUnitsOfType(
CoordinationUnitType type);
std::vector<ProcessCoordinationUnitImpl*> GetAllProcessCoordinationUnits();
// Retrieves the process CU with PID |pid|, if any.
ProcessCoordinationUnitImpl* GetProcessCoordinationUnitByPid(
base::ProcessId pid);
CoordinationUnitBase* GetCoordinationUnitByID(const CoordinationUnitID cu_id);
std::vector<std::unique_ptr<CoordinationUnitGraphObserver>>&
observers_for_testing() {
return observers_;
}
private:
using CUIDMap = std::unordered_map<CoordinationUnitID,
std::unique_ptr<CoordinationUnitBase>>;
using ProcessByPidMap =
std::unordered_map<base::ProcessId, ProcessCoordinationUnitImpl*>;
// Lifetime management functions for CoordinationUnitBase.
friend class CoordinationUnitBase;
CoordinationUnitBase* AddNewCoordinationUnit(
std::unique_ptr<CoordinationUnitBase> new_cu);
void DestroyCoordinationUnit(CoordinationUnitBase* cu);
// Process PID map for use by ProcessCoordinationUnitImpl.
friend class ProcessCoordinationUnitImpl;
void BeforeProcessPidChange(ProcessCoordinationUnitImpl* process,
base::ProcessId new_pid);
CoordinationUnitID system_coordination_unit_id_;
CUIDMap coordination_units_;
ProcessByPidMap processes_by_pid_;
std::vector<std::unique_ptr<CoordinationUnitGraphObserver>> observers_;
ukm::UkmRecorder* ukm_recorder_ = nullptr;
std::unique_ptr<CoordinationUnitProviderImpl> provider_;
static void Create(
service_manager::ServiceContextRefFactory* service_ref_factory);
DISALLOW_COPY_AND_ASSIGN(CoordinationUnitGraph);
};
} // namespace resource_coordinator
#endif // SERVICES_RESOURCE_COORDINATOR_COORDINATION_UNIT_COORDINATION_UNIT_GRAPH_H_