blob: 86c098827b8307567dacbae0e6eef9ca80a51341 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "android_webview/utility/aw_content_utility_client.h"
#include "base/threading/sequenced_task_runner_handle.h"
#include "components/services/heap_profiling/heap_profiling_service.h"
#include "components/services/heap_profiling/public/mojom/constants.mojom.h"
#include "content/public/child/child_thread.h"
#include "content/public/common/service_manager_connection.h"
#include "content/public/common/simple_connection_filter.h"
#include "content/public/utility/utility_thread.h"
#include "services/service_manager/public/cpp/binder_registry.h"
namespace android_webview {
namespace {
void TerminateThisProcess() {
content::UtilityThread::Get()->ReleaseProcess();
}
void RunHeapProfilerOnIOThread(service_manager::mojom::ServiceRequest request,
base::OnceClosure terminate_process) {
service_manager::Service::RunAsyncUntilTermination(
std::make_unique<heap_profiling::HeapProfilingService>(
std::move(request)),
std::move(terminate_process));
}
} // namespace
AwContentUtilityClient::AwContentUtilityClient() = default;
AwContentUtilityClient::~AwContentUtilityClient() = default;
void AwContentUtilityClient::UtilityThreadStarted() {
content::ServiceManagerConnection* connection =
content::ChildThread::Get()->GetServiceManagerConnection();
DCHECK(connection);
auto registry = std::make_unique<service_manager::BinderRegistry>();
connection->AddConnectionFilter(
std::make_unique<content::SimpleConnectionFilter>(std::move(registry)));
}
bool AwContentUtilityClient::HandleServiceRequest(
const std::string& service_name,
service_manager::mojom::ServiceRequest request) {
if (service_name == heap_profiling::mojom::kServiceName) {
base::OnceClosure terminate_process =
base::BindOnce(base::IgnoreResult(&base::SequencedTaskRunner::PostTask),
base::SequencedTaskRunnerHandle::Get(), FROM_HERE,
base::BindOnce(&TerminateThisProcess));
content::ChildThread::Get()->GetIOTaskRunner()->PostTask(
FROM_HERE,
base::BindOnce(&RunHeapProfilerOnIOThread, std::move(request),
std::move(terminate_process)));
return true;
}
return false;
}
} // namespace android_webview