blob: b7d08276f83e93227cc579243af19d9f9e00c748 [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/performance_manager/render_process_user_data.h"
#include <memory>
#include <utility>
#include "base/check.h"
#include "base/command_line.h"
#include "base/functional/bind.h"
#include "base/memory/ptr_util.h"
#include "build/build_config.h"
#include "components/performance_manager/graph/process_node_impl.h"
#include "components/performance_manager/performance_manager_impl.h"
#include "components/performance_manager/public/render_process_host_id.h"
#include "components/performance_manager/public/render_process_host_proxy.h"
#include "content/public/browser/child_process_termination_info.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/common/content_switches.h"
namespace performance_manager {
namespace {
const void* const kRenderProcessUserDataKey = &kRenderProcessUserDataKey;
} // namespace
RenderProcessUserData::RenderProcessUserData(
content::RenderProcessHost* render_process_host)
: host_(render_process_host) {
host_->AddObserver(this);
base::TaskPriority initial_priority = host_->IsSpare()
? base::TaskPriority::LOWEST
: base::TaskPriority::HIGHEST;
process_node_ = PerformanceManagerImpl::CreateProcessNode(
RenderProcessHostProxy(RenderProcessHostId(host_->GetID())),
initial_priority);
}
RenderProcessUserData::~RenderProcessUserData() {
PerformanceManagerImpl::DeleteNode(std::move(process_node_));
host_->RemoveObserver(this);
if (destruction_observer_) {
destruction_observer_->OnRenderProcessUserDataDestroying(host_);
}
}
// static
const void* RenderProcessUserData::UserDataKey() {
return kRenderProcessUserDataKey;
}
// static
RenderProcessUserData* RenderProcessUserData::GetForRenderProcessHost(
content::RenderProcessHost* host) {
return static_cast<RenderProcessUserData*>(
host->GetUserData(kRenderProcessUserDataKey));
}
void RenderProcessUserData::SetDestructionObserver(
DestructionObserver* destruction_observer) {
DCHECK(!destruction_observer || !destruction_observer_);
destruction_observer_ = destruction_observer;
}
void RenderProcessUserData::OnProcessLaunched() {
DCHECK(host_->GetProcess().IsValid());
PerformanceManagerImpl::CallOnGraphImpl(
FROM_HERE, base::BindOnce(&ProcessNodeImpl::SetProcess,
base::Unretained(process_node_.get()),
host_->GetProcess().Duplicate(),
/* launch_time=*/base::TimeTicks::Now()));
}
// static
RenderProcessUserData* RenderProcessUserData::CreateForRenderProcessHost(
content::RenderProcessHost* host) {
DCHECK(!GetForRenderProcessHost(host));
std::unique_ptr<RenderProcessUserData> user_data =
base::WrapUnique(new RenderProcessUserData(host));
RenderProcessUserData* raw_user_data = user_data.get();
host->SetUserData(kRenderProcessUserDataKey, std::move(user_data));
return raw_user_data;
}
void RenderProcessUserData::RenderProcessExited(
content::RenderProcessHost* host,
const content::ChildProcessTerminationInfo& info) {
PerformanceManagerImpl::CallOnGraphImpl(
FROM_HERE,
base::BindOnce(&ProcessNodeImpl::SetProcessExitStatus,
base::Unretained(process_node_.get()), info.exit_code));
}
void RenderProcessUserData::RenderProcessHostDestroyed(
content::RenderProcessHost* host) {
host->RemoveUserData(kRenderProcessUserDataKey);
}
} // namespace performance_manager