blob: 08ba647889a92ef8900626184767d639d396ae87 [file] [log] [blame]
// Copyright 2019 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 COMPONENTS_PERFORMANCE_MANAGER_PERFORMANCE_MANAGER_IMPL_H_
#define COMPONENTS_PERFORMANCE_MANAGER_PERFORMANCE_MANAGER_IMPL_H_
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/callback.h"
#include "base/callback_helpers.h"
#include "base/location.h"
#include "base/sequence_checker.h"
#include "base/sequenced_task_runner.h"
#include "base/task_runner_util.h"
#include "components/performance_manager/graph/graph_impl.h"
#include "components/performance_manager/public/graph/frame_node.h"
#include "components/performance_manager/public/graph/worker_node.h"
#include "components/performance_manager/public/performance_manager.h"
#include "components/performance_manager/public/render_process_host_proxy.h"
#include "components/performance_manager/public/web_contents_proxy.h"
#include "content/public/common/process_type.h"
#include "third_party/blink/public/common/tokens/tokens.h"
class GURL;
namespace performance_manager {
class PageNodeImpl;
// The performance manager is a rendezvous point for binding to performance
// manager interfaces.
class PerformanceManagerImpl : public PerformanceManager {
public:
using FrameNodeCreationCallback = base::OnceCallback<void(FrameNodeImpl*)>;
~PerformanceManagerImpl() override;
// Posts a callback that will run on the PM sequence. Valid to call from any
// sequence.
//
// Note: If called from the main thread, the |graph_callback| is guaranteed to
// run if and only if "IsAvailable()" returns true.
//
// If called from any other sequence, there is no guarantee that the
// callback will run. It will depend on if the PerformanceManager was
// destroyed before the the task is scheduled.
static void CallOnGraphImpl(const base::Location& from_here,
base::OnceClosure callback);
// Same as the above, but the callback is provided a pointer to the graph.
using GraphImplCallback = base::OnceCallback<void(GraphImpl*)>;
static void CallOnGraphImpl(const base::Location& from_here,
GraphImplCallback graph_callback);
// Posts a callback that will run on the PM sequence, and be provided a
// pointer to the Graph. The return value is returned as an argument to the
// reply callback. As opposed to CallOnGraphImpl(), this is valid to call from
// the main thread only, and only if "IsAvailable" returns true.
template <typename TaskReturnType>
static void CallOnGraphAndReplyWithResult(
const base::Location& from_here,
base::OnceCallback<TaskReturnType(GraphImpl*)> task,
base::OnceCallback<void(TaskReturnType)> reply);
// Creates, initializes and registers an instance. Invokes |on_start| on the
// PM sequence. Valid to call from the main thread only.
static std::unique_ptr<PerformanceManagerImpl> Create(
GraphImplCallback on_start);
// Unregisters |instance| and arranges for its deletion on its sequence. Valid
// to call from the main thread only.
static void Destroy(std::unique_ptr<PerformanceManager> instance);
// Creates a new node of the requested type and adds it to the graph.
// May be called from any sequence. If a |creation_callback| is provided, it
// will be run on the performance manager sequence immediately after adding
// the node to the graph. This callback will not be executed if the node could
// not be added to the graph.
//
// Note: If called from the main thread, the node is guaranteed to be added to
// the graph if and only if "IsAvailable()" returns true.
//
// If called from any other sequence, there is no guarantee that the
// node will be added to the graph. It will depend on if the
// PerformanceManager was destroyed before the the task is scheduled.
static std::unique_ptr<FrameNodeImpl> CreateFrameNode(
ProcessNodeImpl* process_node,
PageNodeImpl* page_node,
FrameNodeImpl* parent_frame_node,
int frame_tree_node_id,
int render_frame_id,
const blink::LocalFrameToken& frame_token,
int32_t browsing_instance_id,
int32_t site_instance_id,
FrameNodeCreationCallback creation_callback =
FrameNodeCreationCallback());
static std::unique_ptr<PageNodeImpl> CreatePageNode(
const WebContentsProxy& contents_proxy,
const std::string& browser_context_id,
const GURL& visible_url,
bool is_visible,
bool is_audible,
base::TimeTicks visibility_change_time);
static std::unique_ptr<ProcessNodeImpl> CreateProcessNode(
content::ProcessType process_type,
RenderProcessHostProxy proxy);
static std::unique_ptr<WorkerNodeImpl> CreateWorkerNode(
const std::string& browser_context_id,
WorkerNode::WorkerType worker_type,
ProcessNodeImpl* process_node,
const blink::WorkerToken& worker_token);
// Destroys a node returned from the creation functions above. May be called
// from any sequence.
static void DeleteNode(std::unique_ptr<NodeBase> node);
// Destroys multiples nodes in one single task. Equivalent to calling
// DeleteNode() on all elements of the vector. This function takes care of
// removing them from the graph in topological order and destroying them.
// May be called from any sequence.
static void BatchDeleteNodes(std::vector<std::unique_ptr<NodeBase>> nodes);
// Indicates whether or not the caller is currently running on the PM task
// runner.
static bool OnPMTaskRunnerForTesting();
// Allows testing code to know when tear down is complete. This can only be
// called from the main thread, and the callback will also be invoked on the
// main thread.
static void SetOnDestroyedCallbackForTesting(base::OnceClosure callback);
private:
friend class PerformanceManager;
PerformanceManagerImpl();
// Returns the performance manager TaskRunner.
static scoped_refptr<base::SequencedTaskRunner> GetTaskRunner();
// Retrieves the currently registered instance. Can only be called from the PM
// sequence.
// Note: Only exists so that RunCallbackWithGraphAndReplyWithResult can be
// implemented in the header file.
static PerformanceManagerImpl* GetInstance();
template <typename NodeType, typename... Args>
static std::unique_ptr<NodeType> CreateNodeImpl(
base::OnceCallback<void(NodeType*)> creation_callback,
Args&&... constructor_args);
// Helper functions that removes a node/vector of nodes from the graph on the
// PM sequence and deletes them.
//
// Note that this function has similar semantics to
// SequencedTaskRunner::DeleteSoon(). The node/vector of nodes is passed via a
// regular pointer so that they are not deleted if the task is not executed.
static void DeleteNodeImpl(NodeBase* node_ptr, GraphImpl* graph);
static void BatchDeleteNodesImpl(
std::vector<std::unique_ptr<NodeBase>>* nodes_ptr,
GraphImpl* graph);
void OnStartImpl(GraphImplCallback graph_callback);
static void RunCallbackWithGraphImpl(GraphImplCallback graph_callback);
static void RunCallbackWithGraph(GraphCallback graph_callback);
template <typename TaskReturnType>
static TaskReturnType RunCallbackWithGraphAndReplyWithResult(
base::OnceCallback<TaskReturnType(GraphImpl*)> task);
static void SetOnDestroyedCallbackImpl(base::OnceClosure callback);
GraphImpl graph_ GUARDED_BY_CONTEXT(sequence_checker_);
base::OnceClosure on_destroyed_callback_
GUARDED_BY_CONTEXT(sequence_checker_);
SEQUENCE_CHECKER(sequence_checker_);
DISALLOW_COPY_AND_ASSIGN(PerformanceManagerImpl);
};
// static
template <typename TaskReturnType>
void PerformanceManagerImpl::CallOnGraphAndReplyWithResult(
const base::Location& from_here,
base::OnceCallback<TaskReturnType(GraphImpl*)> task,
base::OnceCallback<void(TaskReturnType)> reply) {
base::PostTaskAndReplyWithResult(
GetTaskRunner().get(), from_here,
base::BindOnce(
&PerformanceManagerImpl::RunCallbackWithGraphAndReplyWithResult<
TaskReturnType>,
std::move(task)),
std::move(reply));
}
// static
template <typename TaskReturnType>
TaskReturnType PerformanceManagerImpl::RunCallbackWithGraphAndReplyWithResult(
base::OnceCallback<TaskReturnType(GraphImpl*)> task) {
return std::move(task).Run(&GetInstance()->graph_);
}
} // namespace performance_manager
#endif // COMPONENTS_PERFORMANCE_MANAGER_PERFORMANCE_MANAGER_IMPL_H_