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() { ...@@ -99,20 +99,21 @@ BackgroundTracingManagerImpl* BackgroundTracingManagerImpl::GetInstance() {
void BackgroundTracingManagerImpl::ActivateForProcess( void BackgroundTracingManagerImpl::ActivateForProcess(
int child_process_id, int child_process_id,
mojom::ChildControl* child_control) { mojom::ChildControl* child_control) {
// NOTE: Called from any thread.
mojo::PendingRemote<tracing::mojom::BackgroundTracingAgentProvider> mojo::PendingRemote<tracing::mojom::BackgroundTracingAgentProvider>
pending_provider; pending_provider;
child_control->GetBackgroundTracingAgentProvider( child_control->GetBackgroundTracingAgentProvider(
pending_provider.InitWithNewPipeAndPassReceiver()); pending_provider.InitWithNewPipeAndPassReceiver());
if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { auto constructor =
base::BindOnce(&BackgroundTracingAgentClientImpl::Create,
child_process_id, std::move(pending_provider));
base::PostTaskWithTraits( base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::UI}, FROM_HERE, {BrowserThread::UI},
base::BindOnce(&BackgroundTracingAgentClientImpl::Create, base::BindOnce(&BackgroundTracingManagerImpl::AddPendingAgentConstructor,
child_process_id, std::move(pending_provider))); std::move(constructor)));
return;
}
BackgroundTracingAgentClientImpl::Create(child_process_id,
std::move(pending_provider));
} }
BackgroundTracingManagerImpl::BackgroundTracingManagerImpl() BackgroundTracingManagerImpl::BackgroundTracingManagerImpl()
...@@ -289,6 +290,8 @@ void BackgroundTracingManagerImpl::AddAgentObserver(AgentObserver* observer) { ...@@ -289,6 +290,8 @@ void BackgroundTracingManagerImpl::AddAgentObserver(AgentObserver* observer) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
agent_observers_.insert(observer); agent_observers_.insert(observer);
MaybeConstructPendingAgents();
for (auto* agent : agents_) { for (auto* agent : agents_) {
observer->OnAgentAdded(agent); observer->OnAgentAdded(agent);
} }
...@@ -481,4 +484,27 @@ void BackgroundTracingManagerImpl::OnScenarioAborted() { ...@@ -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 } // namespace content
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <memory> #include <memory>
#include <set> #include <set>
#include <string> #include <string>
#include <vector>
#include "base/macros.h" #include "base/macros.h"
#include "content/browser/tracing/background_tracing_config_impl.h" #include "content/browser/tracing/background_tracing_config_impl.h"
...@@ -87,6 +88,7 @@ class BackgroundTracingManagerImpl : public BackgroundTracingManager { ...@@ -87,6 +88,7 @@ class BackgroundTracingManagerImpl : public BackgroundTracingManager {
CONTENT_EXPORT static BackgroundTracingManagerImpl* GetInstance(); CONTENT_EXPORT static BackgroundTracingManagerImpl* GetInstance();
// Callable from any thread.
static void ActivateForProcess(int child_process_id, static void ActivateForProcess(int child_process_id,
mojom::ChildControl* child_control); mojom::ChildControl* child_control);
...@@ -149,6 +151,8 @@ class BackgroundTracingManagerImpl : public BackgroundTracingManager { ...@@ -149,6 +151,8 @@ class BackgroundTracingManagerImpl : public BackgroundTracingManager {
perfetto::protos::pbzero::ChromeMetadataPacket* metadata); perfetto::protos::pbzero::ChromeMetadataPacket* metadata);
bool IsTriggerHandleValid(TriggerHandle handle) const; bool IsTriggerHandleValid(TriggerHandle handle) const;
void OnScenarioAborted(); void OnScenarioAborted();
static void AddPendingAgentConstructor(base::OnceClosure constructor);
void MaybeConstructPendingAgents();
std::unique_ptr<BackgroundTracingActiveScenario> active_scenario_; std::unique_ptr<BackgroundTracingActiveScenario> active_scenario_;
...@@ -162,6 +166,8 @@ class BackgroundTracingManagerImpl : public BackgroundTracingManager { ...@@ -162,6 +166,8 @@ class BackgroundTracingManagerImpl : public BackgroundTracingManager {
std::set<tracing::mojom::BackgroundTracingAgent*> agents_; std::set<tracing::mojom::BackgroundTracingAgent*> agents_;
std::set<AgentObserver*> agent_observers_; std::set<AgentObserver*> agent_observers_;
std::vector<base::OnceClosure> pending_agent_constructors_;
IdleCallback idle_callback_; IdleCallback idle_callback_;
base::RepeatingClosure tracing_enabled_callback_for_testing_; 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