Simplify task_manager code now that ProcessHostOnUI is the only path.
Bug: 904556
Change-Id: Ib8a2407f33ef7ac735148aa09f2f5e630ef28758
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3171458
Auto-Submit: John Abd-El-Malek <jam@chromium.org>
Commit-Queue: Ahmed Fakhry <afakhry@chromium.org>
Reviewed-by: Ahmed Fakhry <afakhry@chromium.org>
Cr-Commit-Position: refs/heads/main@{#923645}
diff --git a/chrome/browser/task_manager/providers/child_process_task.cc b/chrome/browser/task_manager/providers/child_process_task.cc
index e18b71a..b8404219 100644
--- a/chrome/browser/task_manager/providers/child_process_task.cc
+++ b/chrome/browser/task_manager/providers/child_process_task.cc
@@ -25,7 +25,6 @@
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/child_process_data.h"
#include "content/public/common/child_process_host.h"
-#include "content/public/common/content_features.h"
#include "content/public/common/process_type.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/common/extension_set.h"
@@ -121,38 +120,18 @@
return result_title;
}
-// Connects the |resource_reporter| to the InterfaceRegistry of the
-// BrowserChildProcessHost whose unique ID is |unique_child_process_id|.
-void ConnectResourceReporterOnIOThread(
- int unique_child_process_id,
- mojo::PendingReceiver<content::mojom::ResourceUsageReporter>
- resource_reporter) {
- DCHECK_CURRENTLY_ON(base::FeatureList::IsEnabled(features::kProcessHostOnUI)
- ? content::BrowserThread::UI
- : content::BrowserThread::IO);
-
- content::BrowserChildProcessHost* host =
- content::BrowserChildProcessHost::FromID(unique_child_process_id);
- if (!host)
- return;
-
- host->GetHost()->BindReceiver(std::move(resource_reporter));
-}
-
// Creates the Mojo service wrapper that will be used to sample the V8 memory
// usage of the browser child process whose unique ID is
// |unique_child_process_id|.
ProcessResourceUsage* CreateProcessResourcesSampler(
int unique_child_process_id) {
mojo::PendingRemote<content::mojom::ResourceUsageReporter> usage_reporter;
- auto task_runner = base::FeatureList::IsEnabled(features::kProcessHostOnUI)
- ? content::GetUIThreadTaskRunner({})
- : content::GetIOThreadTaskRunner({});
- task_runner->PostTask(
- FROM_HERE,
- base::BindOnce(&ConnectResourceReporterOnIOThread,
- unique_child_process_id,
- usage_reporter.InitWithNewPipeAndPassReceiver()));
+ content::BrowserChildProcessHost* host =
+ content::BrowserChildProcessHost::FromID(unique_child_process_id);
+ auto receiver = usage_reporter.InitWithNewPipeAndPassReceiver();
+ if (host)
+ host->GetHost()->BindReceiver(std::move(receiver));
+
return new ProcessResourceUsage(std::move(usage_reporter));
}
diff --git a/chrome/browser/task_manager/providers/child_process_task_provider.cc b/chrome/browser/task_manager/providers/child_process_task_provider.cc
index f966fdc3..ce86c82 100644
--- a/chrome/browser/task_manager/providers/child_process_task_provider.cc
+++ b/chrome/browser/task_manager/providers/child_process_task_provider.cc
@@ -13,7 +13,6 @@
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/child_process_data.h"
-#include "content/public/common/content_features.h"
using content::BrowserChildProcessHostIterator;
using content::BrowserThread;
@@ -21,34 +20,6 @@
namespace task_manager {
-namespace {
-
-// Collects and returns the child processes data on the IO thread to get all the
-// pre-existing child process before we start observing
-// |BrowserChildProcessObserver|.
-std::unique_ptr<std::vector<ChildProcessData>> CollectChildProcessData() {
- // The |BrowserChildProcessHostIterator| must only be used on the IO thread.
- DCHECK_CURRENTLY_ON(base::FeatureList::IsEnabled(features::kProcessHostOnUI)
- ? content::BrowserThread::UI
- : content::BrowserThread::IO);
-
- std::unique_ptr<std::vector<ChildProcessData>> child_processes(
- new std::vector<ChildProcessData>());
- for (BrowserChildProcessHostIterator itr; !itr.Done(); ++itr) {
- const ChildProcessData& process_data = itr.GetData();
-
- // Only add processes that have already started, i.e. with valid handles.
- if (!process_data.GetProcess().IsValid())
- continue;
-
- child_processes->push_back(process_data.Duplicate());
- }
-
- return child_processes;
-}
-
-} // namespace
-
ChildProcessTaskProvider::ChildProcessTaskProvider() {}
ChildProcessTaskProvider::~ChildProcessTaskProvider() {
@@ -85,22 +56,28 @@
DCHECK(tasks_by_child_id_.empty());
// First, get the pre-existing child processes data.
- auto task_runner = base::FeatureList::IsEnabled(features::kProcessHostOnUI)
- ? content::GetUIThreadTaskRunner({})
- : content::GetIOThreadTaskRunner({});
- task_runner->PostTaskAndReplyWithResult(
- FROM_HERE, base::BindOnce(&CollectChildProcessData),
- base::BindOnce(&ChildProcessTaskProvider::ChildProcessDataCollected,
- weak_ptr_factory_.GetWeakPtr()));
+ std::unique_ptr<std::vector<ChildProcessData>> child_processes(
+ new std::vector<ChildProcessData>());
+ for (BrowserChildProcessHostIterator itr; !itr.Done(); ++itr) {
+ const ChildProcessData& process_data = itr.GetData();
+
+ // Only add processes that have already started, i.e. with valid handles.
+ if (!process_data.GetProcess().IsValid())
+ continue;
+
+ child_processes->push_back(process_data.Duplicate());
+ }
+
+ for (const auto& process_data : *child_processes)
+ CreateTask(process_data);
+
+ // Now start observing.
+ BrowserChildProcessObserver::Add(this);
}
void ChildProcessTaskProvider::StopUpdating() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- // ChildProcessDataCollected() should never be called after this, and hence
- // we must invalidate the weak pointers.
- weak_ptr_factory_.InvalidateWeakPtrs();
-
// First, stop observing.
BrowserChildProcessObserver::Remove(this);
@@ -112,18 +89,6 @@
tasks_by_child_id_.clear();
}
-void ChildProcessTaskProvider::ChildProcessDataCollected(
- std::unique_ptr<const std::vector<content::ChildProcessData>>
- child_processes) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
- for (const auto& process_data : *child_processes)
- CreateTask(process_data);
-
- // Now start observing.
- BrowserChildProcessObserver::Add(this);
-}
-
void ChildProcessTaskProvider::CreateTask(
const content::ChildProcessData& data) {
std::unique_ptr<ChildProcessTask>& task =
diff --git a/chrome/browser/task_manager/providers/child_process_task_provider.h b/chrome/browser/task_manager/providers/child_process_task_provider.h
index ab83196..fe5b05d 100644
--- a/chrome/browser/task_manager/providers/child_process_task_provider.h
+++ b/chrome/browser/task_manager/providers/child_process_task_provider.h
@@ -10,7 +10,6 @@
#include <vector>
#include "base/containers/flat_map.h"
-#include "base/memory/weak_ptr.h"
#include "chrome/browser/task_manager/providers/task_provider.h"
#include "content/public/browser/browser_child_process_observer.h"
@@ -49,13 +48,6 @@
void StartUpdating() override;
void StopUpdating() override;
- // The pre-existing child processes data will be collected on the IO thread.
- // When that is done, we will be notified on the UI thread by receiving a call
- // to this method.
- void ChildProcessDataCollected(
- std::unique_ptr<const std::vector<content::ChildProcessData>>
- child_processes);
-
// Creates a ChildProcessTask from the given |data| and notifies the observer
// of its addition.
void CreateTask(const content::ChildProcessData& data);
@@ -74,10 +66,6 @@
// A map to track ChildProcessTask's by their child process unique ids.
base::flat_map<int, ChildProcessTask*> tasks_by_child_id_;
-
- // Always keep this the last member of this class to make sure it's the
- // first thing to be destructed.
- base::WeakPtrFactory<ChildProcessTaskProvider> weak_ptr_factory_{this};
};
} // namespace task_manager
diff --git a/chrome/browser/task_manager/sampling/task_group.cc b/chrome/browser/task_manager/sampling/task_group.cc
index 50f9f5d..b56ca8f 100644
--- a/chrome/browser/task_manager/sampling/task_group.cc
+++ b/chrome/browser/task_manager/sampling/task_group.cc
@@ -17,7 +17,6 @@
#include "components/nacl/browser/nacl_browser.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
-#include "content/public/common/content_features.h"
#include "gpu/ipc/common/memory_stats.h"
#if defined(OS_WIN)
@@ -305,20 +304,13 @@
#if BUILDFLAG(ENABLE_NACL)
void TaskGroup::RefreshNaClDebugStubPort(int child_process_unique_id) {
- if (base::FeatureList::IsEnabled(features::kProcessHostOnUI)) {
- base::SequencedTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::BindOnce(&TaskGroup::OnRefreshNaClDebugStubPortDone,
- weak_ptr_factory_.GetWeakPtr(),
- GetNaClDebugStubPortOnProcessThread(
- child_process_unique_id)));
- } else {
- content::GetIOThreadTaskRunner({})->PostTaskAndReplyWithResult(
- FROM_HERE,
- base::BindOnce(&GetNaClDebugStubPortOnProcessThread,
- child_process_unique_id),
- base::BindOnce(&TaskGroup::OnRefreshNaClDebugStubPortDone,
- weak_ptr_factory_.GetWeakPtr()));
- }
+ // Note this needs to be in a PostTask to avoid a use-after-free (see
+ // https://crbug.com/1221406).
+ base::SequencedTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::BindOnce(&TaskGroup::OnRefreshNaClDebugStubPortDone,
+ weak_ptr_factory_.GetWeakPtr(),
+ GetNaClDebugStubPortOnProcessThread(
+ child_process_unique_id)));
}
void TaskGroup::OnRefreshNaClDebugStubPortDone(int nacl_debug_stub_port) {