Commit aa3f8010 authored by François Doray's avatar François Doray Committed by Commit Bot

[PM] Extend the lifetime of PerformanceManagerLockObserver.

PerformanceManagerLockObserver must stay alive until after
base::ThreadPool shutdown because it can be accessed by IndexedDB
which runs on a base::ThreadPool sequence.

Bug: 980533
Change-Id: I6d454cffa68cb776b9c4abf3180506096c4e91c4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1856891
Commit-Queue: François Doray <fdoray@chromium.org>
Reviewed-by: default avatarSébastien Marchand <sebmarchand@chromium.org>
Cr-Commit-Position: refs/heads/master@{#705370}
parent c4f17441
...@@ -223,7 +223,6 @@ ...@@ -223,7 +223,6 @@
#include "components/page_load_metrics/browser/page_load_metrics_util.h" #include "components/page_load_metrics/browser/page_load_metrics_util.h"
#include "components/password_manager/content/browser/content_password_manager_driver_factory.h" #include "components/password_manager/content/browser/content_password_manager_driver_factory.h"
#include "components/payments/content/payment_request_display_manager.h" #include "components/payments/content/payment_request_display_manager.h"
#include "components/performance_manager/public/performance_manager.h"
#include "components/policy/content/policy_blacklist_navigation_throttle.h" #include "components/policy/content/policy_blacklist_navigation_throttle.h"
#include "components/policy/content/policy_blacklist_service.h" #include "components/policy/content/policy_blacklist_service.h"
#include "components/policy/core/common/policy_service.h" #include "components/policy/core/common/policy_service.h"
...@@ -2844,7 +2843,8 @@ content::MediaObserver* ChromeContentBrowserClient::GetMediaObserver() { ...@@ -2844,7 +2843,8 @@ content::MediaObserver* ChromeContentBrowserClient::GetMediaObserver() {
} }
content::LockObserver* ChromeContentBrowserClient::GetLockObserver() { content::LockObserver* ChromeContentBrowserClient::GetLockObserver() {
return performance_manager::PerformanceManager::GetLockObserver(); return ChromeBrowserMainExtraPartsPerformanceManager::GetInstance()
->GetLockObserver();
} }
content::PlatformNotificationService* content::PlatformNotificationService*
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/profiles/profile_manager.h"
#include "components/performance_manager/graph/graph_impl.h" #include "components/performance_manager/graph/graph_impl.h"
#include "components/performance_manager/performance_manager_impl.h" #include "components/performance_manager/performance_manager_impl.h"
#include "components/performance_manager/performance_manager_lock_observer.h"
#include "components/performance_manager/performance_manager_tab_helper.h" #include "components/performance_manager/performance_manager_tab_helper.h"
#include "components/performance_manager/render_process_user_data.h" #include "components/performance_manager/render_process_user_data.h"
#include "components/performance_manager/shared_worker_watcher.h" #include "components/performance_manager/shared_worker_watcher.h"
...@@ -38,10 +39,29 @@ ...@@ -38,10 +39,29 @@
#endif // BUILDFLAG(USE_TCMALLOC) #endif // BUILDFLAG(USE_TCMALLOC)
#endif // defined(OS_LINUX) #endif // defined(OS_LINUX)
namespace {
ChromeBrowserMainExtraPartsPerformanceManager* g_instance = nullptr;
}
ChromeBrowserMainExtraPartsPerformanceManager:: ChromeBrowserMainExtraPartsPerformanceManager::
ChromeBrowserMainExtraPartsPerformanceManager() = default; ChromeBrowserMainExtraPartsPerformanceManager()
: lock_observer_(std::make_unique<
performance_manager::PerformanceManagerLockObserver>()) {
DCHECK(!g_instance);
g_instance = this;
}
ChromeBrowserMainExtraPartsPerformanceManager:: ChromeBrowserMainExtraPartsPerformanceManager::
~ChromeBrowserMainExtraPartsPerformanceManager() = default; ~ChromeBrowserMainExtraPartsPerformanceManager() {
DCHECK_EQ(this, g_instance);
g_instance = nullptr;
}
// static
ChromeBrowserMainExtraPartsPerformanceManager*
ChromeBrowserMainExtraPartsPerformanceManager::GetInstance() {
return g_instance;
}
// static // static
void ChromeBrowserMainExtraPartsPerformanceManager:: void ChromeBrowserMainExtraPartsPerformanceManager::
...@@ -74,6 +94,11 @@ void ChromeBrowserMainExtraPartsPerformanceManager:: ...@@ -74,6 +94,11 @@ void ChromeBrowserMainExtraPartsPerformanceManager::
#endif // defined(OS_LINUX) #endif // defined(OS_LINUX)
} }
content::LockObserver*
ChromeBrowserMainExtraPartsPerformanceManager::GetLockObserver() {
return lock_observer_.get();
}
void ChromeBrowserMainExtraPartsPerformanceManager::PostCreateThreads() { void ChromeBrowserMainExtraPartsPerformanceManager::PostCreateThreads() {
performance_manager_ = performance_manager::PerformanceManagerImpl::Create( performance_manager_ = performance_manager::PerformanceManagerImpl::Create(
base::BindOnce(&ChromeBrowserMainExtraPartsPerformanceManager:: base::BindOnce(&ChromeBrowserMainExtraPartsPerformanceManager::
......
...@@ -18,6 +18,10 @@ ...@@ -18,6 +18,10 @@
class Profile; class Profile;
namespace content {
class LockObserver;
}
namespace performance_manager { namespace performance_manager {
class BrowserChildProcessWatcher; class BrowserChildProcessWatcher;
class GraphImpl; class GraphImpl;
...@@ -34,9 +38,18 @@ class ChromeBrowserMainExtraPartsPerformanceManager ...@@ -34,9 +38,18 @@ class ChromeBrowserMainExtraPartsPerformanceManager
ChromeBrowserMainExtraPartsPerformanceManager(); ChromeBrowserMainExtraPartsPerformanceManager();
~ChromeBrowserMainExtraPartsPerformanceManager() override; ~ChromeBrowserMainExtraPartsPerformanceManager() override;
// Returns the only instance of this class.
static ChromeBrowserMainExtraPartsPerformanceManager* GetInstance();
static void CreateDefaultPoliciesAndDecorators( static void CreateDefaultPoliciesAndDecorators(
performance_manager::GraphImpl* graph); performance_manager::GraphImpl* graph);
// Returns the LockObserver that should be exposed to //content to allow the
// performance manager to track usage of locks in frames. Valid to call from
// any thread, but external synchronization is needed to make sure that the
// performance manager is available.
content::LockObserver* GetLockObserver();
private: private:
// ChromeBrowserMainExtraParts overrides. // ChromeBrowserMainExtraParts overrides.
void PostCreateThreads() override; void PostCreateThreads() override;
...@@ -54,6 +67,11 @@ class ChromeBrowserMainExtraPartsPerformanceManager ...@@ -54,6 +67,11 @@ class ChromeBrowserMainExtraPartsPerformanceManager
std::unique_ptr<performance_manager::PerformanceManagerImpl> std::unique_ptr<performance_manager::PerformanceManagerImpl>
performance_manager_; performance_manager_;
// This must be alive at least until the end of base::ThreadPool shutdown,
// because it can be accessed by IndexedDB which runs on a base::ThreadPool
// sequence.
const std::unique_ptr<content::LockObserver> lock_observer_;
std::unique_ptr<performance_manager::BrowserChildProcessWatcher> std::unique_ptr<performance_manager::BrowserChildProcessWatcher>
browser_child_process_watcher_; browser_child_process_watcher_;
......
...@@ -45,9 +45,4 @@ void PerformanceManager::PassToGraph(const base::Location& from_here, ...@@ -45,9 +45,4 @@ void PerformanceManager::PassToGraph(const base::Location& from_here,
std::move(graph_owned))); std::move(graph_owned)));
} }
// static
content::LockObserver* PerformanceManager::GetLockObserver() {
return PerformanceManagerImpl::GetInstance()->lock_observer();
}
} // namespace performance_manager } // namespace performance_manager
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include "base/sequenced_task_runner.h" #include "base/sequenced_task_runner.h"
#include "base/task_runner_util.h" #include "base/task_runner_util.h"
#include "components/performance_manager/graph/graph_impl.h" #include "components/performance_manager/graph/graph_impl.h"
#include "components/performance_manager/performance_manager_lock_observer.h"
#include "components/performance_manager/public/graph/worker_node.h" #include "components/performance_manager/public/graph/worker_node.h"
#include "components/performance_manager/public/performance_manager.h" #include "components/performance_manager/public/performance_manager.h"
#include "components/performance_manager/public/render_process_host_proxy.h" #include "components/performance_manager/public/render_process_host_proxy.h"
...@@ -117,8 +116,6 @@ class PerformanceManagerImpl : public PerformanceManager { ...@@ -117,8 +116,6 @@ class PerformanceManagerImpl : public PerformanceManager {
// TODO(chrisha): Hide this after the last consumer stops using it! // TODO(chrisha): Hide this after the last consumer stops using it!
static scoped_refptr<base::SequencedTaskRunner> GetTaskRunner(); static scoped_refptr<base::SequencedTaskRunner> GetTaskRunner();
content::LockObserver* lock_observer() { return &lock_observer_; }
// Indicates whether or not the caller is currently running on the PM task // Indicates whether or not the caller is currently running on the PM task
// runner. // runner.
bool OnPMTaskRunnerForTesting() const { bool OnPMTaskRunnerForTesting() const {
...@@ -149,9 +146,6 @@ class PerformanceManagerImpl : public PerformanceManager { ...@@ -149,9 +146,6 @@ class PerformanceManagerImpl : public PerformanceManager {
GraphImpl graph_; GraphImpl graph_;
// The LockObserver registered with //content to track lock acquisitions.
PerformanceManagerLockObserver lock_observer_;
SEQUENCE_CHECKER(sequence_checker_); SEQUENCE_CHECKER(sequence_checker_);
DISALLOW_COPY_AND_ASSIGN(PerformanceManagerImpl); DISALLOW_COPY_AND_ASSIGN(PerformanceManagerImpl);
......
...@@ -25,7 +25,11 @@ void SetIsHoldingWebLock(int render_process_id, ...@@ -25,7 +25,11 @@ void SetIsHoldingWebLock(int render_process_id,
} // namespace } // namespace
PerformanceManagerLockObserver::PerformanceManagerLockObserver() = default; PerformanceManagerLockObserver::PerformanceManagerLockObserver() = default;
PerformanceManagerLockObserver::~PerformanceManagerLockObserver() = default;
PerformanceManagerLockObserver::~PerformanceManagerLockObserver() {
// TODO(https://crbug.com/1013760): DCHECK that this happens after ThreadPool
// shutdown.
}
void PerformanceManagerLockObserver::OnFrameStartsHoldingWebLocks( void PerformanceManagerLockObserver::OnFrameStartsHoldingWebLocks(
int render_process_id, int render_process_id,
......
...@@ -8,10 +8,6 @@ ...@@ -8,10 +8,6 @@
#include "base/callback.h" #include "base/callback.h"
#include "base/location.h" #include "base/location.h"
namespace content {
class LockObserver;
}
namespace performance_manager { namespace performance_manager {
class Graph; class Graph;
...@@ -37,12 +33,6 @@ class PerformanceManager { ...@@ -37,12 +33,6 @@ class PerformanceManager {
static void PassToGraph(const base::Location& from_here, static void PassToGraph(const base::Location& from_here,
std::unique_ptr<GraphOwned> graph_owned); std::unique_ptr<GraphOwned> graph_owned);
// Returns the LockObserver that should be exposed to //content to allow the
// performance manager to track usage of locks in frames. Valid to call from
// any thread, but external synchronization is needed to make sure that the
// performance manager is available.
static content::LockObserver* GetLockObserver();
protected: protected:
PerformanceManager(); PerformanceManager();
virtual ~PerformanceManager(); virtual ~PerformanceManager();
......
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