1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/utility/chrome_content_utility_client.h"
#include <stddef.h>
#include <utility>
#include "base/check.h"
#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/path_service.h"
#include "base/profiler/thread_group_profiler.h"
#include "base/task/single_thread_task_runner.h"
#include "build/build_config.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/profiler/chrome_thread_group_profiler_client.h"
#include "chrome/common/profiler/chrome_thread_profiler_client.h"
#include "chrome/common/profiler/thread_profiler_configuration.h"
#include "chrome/utility/services.h"
#include "components/heap_profiling/in_process/heap_profiler_controller.h"
#include "components/metrics/call_stacks/call_stack_profile_builder.h"
#include "components/sampling_profiler/process_type.h"
#include "components/sampling_profiler/thread_profiler.h"
#include "content/public/child/child_thread.h"
#include "content/public/common/content_switches.h"
#if BUILDFLAG(IS_CHROMEOS)
#include "chromeos/ash/components/mojo_service_manager/connection.h"
#endif // BUILDFLAG(IS_CHROMEOS)
#if BUILDFLAG(IS_WIN)
#include "sandbox/policy/mojom/sandbox.mojom.h"
#include "sandbox/policy/sandbox_type.h"
#endif
ChromeContentUtilityClient::ChromeContentUtilityClient() {
base::ThreadGroupProfiler::SetClient(
std::make_unique<ChromeThreadGroupProfilerClient>());
sampling_profiler::ThreadProfiler::SetClient(
std::make_unique<ChromeThreadProfilerClient>());
}
ChromeContentUtilityClient::~ChromeContentUtilityClient() = default;
void ChromeContentUtilityClient::ExposeInterfacesToBrowser(
mojo::BinderMap* binders) {
#if BUILDFLAG(IS_WIN)
auto& cmd_line = *base::CommandLine::ForCurrentProcess();
auto sandbox_type = sandbox::policy::SandboxTypeFromCommandLine(cmd_line);
utility_process_running_elevated_ =
sandbox_type == sandbox::mojom::Sandbox::kNoSandboxAndElevatedPrivileges;
#endif
}
void ChromeContentUtilityClient::UtilityThreadStarted() {
// Only builds message pipes for utility processes which enable sampling
// profilers.
const base::CommandLine* command_line =
base::CommandLine::ForCurrentProcess();
const std::string process_type =
command_line->GetSwitchValueASCII(switches::kProcessType);
// An in-process utility thread may run in other processes, only set up
// collector in a utility process.
if (process_type == switches::kUtilityProcess) {
const auto* heap_profiler_controller =
heap_profiling::HeapProfilerController::GetInstance();
// The HeapProfilerController should have been created in
// ChromeMainDelegate::PostEarlyInitialization.
CHECK(heap_profiler_controller);
if (ThreadProfilerConfiguration::Get()
->IsProfilerEnabledForCurrentProcess() ||
heap_profiler_controller->IsEnabled()) {
mojo::PendingRemote<metrics::mojom::CallStackProfileCollector> collector;
content::ChildThread::Get()->BindHostReceiver(
collector.InitWithNewPipeAndPassReceiver());
metrics::CallStackProfileBuilder::
SetParentProfileCollectorForChildProcess(std::move(collector));
}
}
}
void ChromeContentUtilityClient::RegisterMainThreadServices(
mojo::ServiceFactory& services) {
if (utility_process_running_elevated_)
return ::RegisterElevatedMainThreadServices(services);
return ::RegisterMainThreadServices(services);
}
void ChromeContentUtilityClient::PostIOThreadCreated(
base::SingleThreadTaskRunner* io_thread_task_runner) {
io_thread_task_runner->PostTask(
FROM_HERE,
base::BindOnce(&sampling_profiler::ThreadProfiler::StartOnChildThread,
sampling_profiler::ProfilerThreadType::kIo));
}
void ChromeContentUtilityClient::RegisterIOThreadServices(
mojo::ServiceFactory& services) {
return ::RegisterIOThreadServices(services);
}
#if BUILDFLAG(IS_CHROMEOS)
mojo::GenericPendingReceiver
ChromeContentUtilityClient::InitMojoServiceManager() {
return ash::mojo_service_manager::BootstrapServiceManagerInUtilityProcess();
}
#endif // BUILDFLAG(IS_CHROMEOS)
|