Commit 53ceb182 authored by Darin Fisher's avatar Darin Fisher Committed by Commit Bot

Lazily initialize background tracing agents

Bug: 971859
Change-Id: I9213044a1555ddebffb7562ebd0a9448cfba9a4e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1670318Reviewed-by: default avataroysteine <oysteine@chromium.org>
Commit-Queue: Darin Fisher <darin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#671429}
parent 8003e808
......@@ -99,20 +99,21 @@ BackgroundTracingManagerImpl* BackgroundTracingManagerImpl::GetInstance() {
void BackgroundTracingManagerImpl::ActivateForProcess(
int child_process_id,
mojom::ChildControl* child_control) {
// NOTE: Called from any thread.
mojo::PendingRemote<tracing::mojom::BackgroundTracingAgentProvider>
pending_provider;
child_control->GetBackgroundTracingAgentProvider(
pending_provider.InitWithNewPipeAndPassReceiver());
if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::UI},
base::BindOnce(&BackgroundTracingAgentClientImpl::Create,
child_process_id, std::move(pending_provider)));
return;
}
BackgroundTracingAgentClientImpl::Create(child_process_id,
std::move(pending_provider));
auto constructor =
base::BindOnce(&BackgroundTracingAgentClientImpl::Create,
child_process_id, std::move(pending_provider));
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::UI},
base::BindOnce(&BackgroundTracingManagerImpl::AddPendingAgentConstructor,
std::move(constructor)));
}
BackgroundTracingManagerImpl::BackgroundTracingManagerImpl()
......@@ -289,6 +290,8 @@ void BackgroundTracingManagerImpl::AddAgentObserver(AgentObserver* observer) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
agent_observers_.insert(observer);
MaybeConstructPendingAgents();
for (auto* agent : agents_) {
observer->OnAgentAdded(agent);
}
......@@ -481,4 +484,27 @@ void BackgroundTracingManagerImpl::OnScenarioAborted() {
}
}
// static
void BackgroundTracingManagerImpl::AddPendingAgentConstructor(
base::OnceClosure constructor) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
// Stash away the parameters here, and delay agent initialization until we
// have an interested AgentObserver.
GetInstance()->pending_agent_constructors_.push_back(std::move(constructor));
GetInstance()->MaybeConstructPendingAgents();
}
void BackgroundTracingManagerImpl::MaybeConstructPendingAgents() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (agent_observers_.empty())
return;
for (auto& constructor : pending_agent_constructors_)
std::move(constructor).Run();
pending_agent_constructors_.clear();
}
} // namespace content
......@@ -9,6 +9,7 @@
#include <memory>
#include <set>
#include <string>
#include <vector>
#include "base/macros.h"
#include "content/browser/tracing/background_tracing_config_impl.h"
......@@ -87,6 +88,7 @@ class BackgroundTracingManagerImpl : public BackgroundTracingManager {
CONTENT_EXPORT static BackgroundTracingManagerImpl* GetInstance();
// Callable from any thread.
static void ActivateForProcess(int child_process_id,
mojom::ChildControl* child_control);
......@@ -149,6 +151,8 @@ class BackgroundTracingManagerImpl : public BackgroundTracingManager {
perfetto::protos::pbzero::ChromeMetadataPacket* metadata);
bool IsTriggerHandleValid(TriggerHandle handle) const;
void OnScenarioAborted();
static void AddPendingAgentConstructor(base::OnceClosure constructor);
void MaybeConstructPendingAgents();
std::unique_ptr<BackgroundTracingActiveScenario> active_scenario_;
......@@ -162,6 +166,8 @@ class BackgroundTracingManagerImpl : public BackgroundTracingManager {
std::set<tracing::mojom::BackgroundTracingAgent*> agents_;
std::set<AgentObserver*> agent_observers_;
std::vector<base::OnceClosure> pending_agent_constructors_;
IdleCallback idle_callback_;
base::RepeatingClosure tracing_enabled_callback_for_testing_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment