xref: /aosp_15_r20/external/cronet/base/tracing/perfetto_platform.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2020 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/tracing/perfetto_platform.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include "base/strings/strcat.h"
8*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/task/deferred_sequenced_task_runner.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/task/task_traits.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/task/thread_pool.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/trace_event/trace_event.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/tracing/perfetto_task_runner.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/tracing_buildflags.h"
15*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
18*6777b538SAndroid Build Coastguard Worker #include "base/android/build_info.h"
19*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_ANDROID)
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_NACL)
22*6777b538SAndroid Build Coastguard Worker #include "third_party/perfetto/include/perfetto/ext/base/thread_task_runner.h"
23*6777b538SAndroid Build Coastguard Worker #endif
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker namespace base {
26*6777b538SAndroid Build Coastguard Worker namespace tracing {
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker namespace {
29*6777b538SAndroid Build Coastguard Worker constexpr char kProcessNamePrefix[] = "org.chromium-";
30*6777b538SAndroid Build Coastguard Worker }  // namespace
31*6777b538SAndroid Build Coastguard Worker 
PerfettoPlatform(TaskRunnerType task_runner_type)32*6777b538SAndroid Build Coastguard Worker PerfettoPlatform::PerfettoPlatform(TaskRunnerType task_runner_type)
33*6777b538SAndroid Build Coastguard Worker     : task_runner_type_(task_runner_type),
34*6777b538SAndroid Build Coastguard Worker       deferred_task_runner_(new DeferredSequencedTaskRunner()),
35*6777b538SAndroid Build Coastguard Worker       thread_local_object_([](void* object) {
36*6777b538SAndroid Build Coastguard Worker         delete static_cast<ThreadLocalObject*>(object);
37*6777b538SAndroid Build Coastguard Worker       }) {}
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker PerfettoPlatform::~PerfettoPlatform() = default;
40*6777b538SAndroid Build Coastguard Worker 
StartTaskRunner(scoped_refptr<SequencedTaskRunner> task_runner)41*6777b538SAndroid Build Coastguard Worker void PerfettoPlatform::StartTaskRunner(
42*6777b538SAndroid Build Coastguard Worker     scoped_refptr<SequencedTaskRunner> task_runner) {
43*6777b538SAndroid Build Coastguard Worker   DCHECK_EQ(task_runner_type_, TaskRunnerType::kThreadPool);
44*6777b538SAndroid Build Coastguard Worker   DCHECK(!did_start_task_runner_);
45*6777b538SAndroid Build Coastguard Worker   deferred_task_runner_->StartWithTaskRunner(task_runner);
46*6777b538SAndroid Build Coastguard Worker   did_start_task_runner_ = true;
47*6777b538SAndroid Build Coastguard Worker }
48*6777b538SAndroid Build Coastguard Worker 
task_runner() const49*6777b538SAndroid Build Coastguard Worker SequencedTaskRunner* PerfettoPlatform::task_runner() const {
50*6777b538SAndroid Build Coastguard Worker   return deferred_task_runner_.get();
51*6777b538SAndroid Build Coastguard Worker }
52*6777b538SAndroid Build Coastguard Worker 
53*6777b538SAndroid Build Coastguard Worker PerfettoPlatform::ThreadLocalObject*
GetOrCreateThreadLocalObject()54*6777b538SAndroid Build Coastguard Worker PerfettoPlatform::GetOrCreateThreadLocalObject() {
55*6777b538SAndroid Build Coastguard Worker   auto* object = static_cast<ThreadLocalObject*>(thread_local_object_.Get());
56*6777b538SAndroid Build Coastguard Worker   if (!object) {
57*6777b538SAndroid Build Coastguard Worker     object = ThreadLocalObject::CreateInstance().release();
58*6777b538SAndroid Build Coastguard Worker     thread_local_object_.Set(object);
59*6777b538SAndroid Build Coastguard Worker   }
60*6777b538SAndroid Build Coastguard Worker   return object;
61*6777b538SAndroid Build Coastguard Worker }
62*6777b538SAndroid Build Coastguard Worker 
CreateTaskRunner(const CreateTaskRunnerArgs &)63*6777b538SAndroid Build Coastguard Worker std::unique_ptr<perfetto::base::TaskRunner> PerfettoPlatform::CreateTaskRunner(
64*6777b538SAndroid Build Coastguard Worker     const CreateTaskRunnerArgs&) {
65*6777b538SAndroid Build Coastguard Worker   switch (task_runner_type_) {
66*6777b538SAndroid Build Coastguard Worker     case TaskRunnerType::kBuiltin:
67*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_NACL)
68*6777b538SAndroid Build Coastguard Worker       return std::make_unique<perfetto::base::ThreadTaskRunner>(
69*6777b538SAndroid Build Coastguard Worker           perfetto::base::ThreadTaskRunner::CreateAndStart());
70*6777b538SAndroid Build Coastguard Worker #else
71*6777b538SAndroid Build Coastguard Worker       DCHECK(false);
72*6777b538SAndroid Build Coastguard Worker       return nullptr;
73*6777b538SAndroid Build Coastguard Worker #endif
74*6777b538SAndroid Build Coastguard Worker     case TaskRunnerType::kThreadPool:
75*6777b538SAndroid Build Coastguard Worker       // We can't create a real task runner yet because the ThreadPool may not
76*6777b538SAndroid Build Coastguard Worker       // be initialized. Instead, we point Perfetto to a buffering task runner
77*6777b538SAndroid Build Coastguard Worker       // which will become active as soon as the thread pool is up (see
78*6777b538SAndroid Build Coastguard Worker       // StartTaskRunner).
79*6777b538SAndroid Build Coastguard Worker       return std::make_unique<PerfettoTaskRunner>(deferred_task_runner_);
80*6777b538SAndroid Build Coastguard Worker   }
81*6777b538SAndroid Build Coastguard Worker }
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker // This method is used by the SDK to determine the producer name.
84*6777b538SAndroid Build Coastguard Worker // Note that we override the producer name for the mojo backend in ProducerHost,
85*6777b538SAndroid Build Coastguard Worker // and thus this only affects the producer name for the system backend.
GetCurrentProcessName()86*6777b538SAndroid Build Coastguard Worker std::string PerfettoPlatform::GetCurrentProcessName() {
87*6777b538SAndroid Build Coastguard Worker   const char* host_package_name = nullptr;
88*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
89*6777b538SAndroid Build Coastguard Worker   host_package_name = android::BuildInfo::GetInstance()->host_package_name();
90*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_ANDROID)
91*6777b538SAndroid Build Coastguard Worker 
92*6777b538SAndroid Build Coastguard Worker   // On Android we want to include if this is webview inside of an app or
93*6777b538SAndroid Build Coastguard Worker   // Android Chrome. To aid this we add the host_package_name to differentiate
94*6777b538SAndroid Build Coastguard Worker   // the various apps and sources.
95*6777b538SAndroid Build Coastguard Worker   std::string process_name;
96*6777b538SAndroid Build Coastguard Worker   if (host_package_name) {
97*6777b538SAndroid Build Coastguard Worker     process_name = StrCat(
98*6777b538SAndroid Build Coastguard Worker         {kProcessNamePrefix, host_package_name, "-",
99*6777b538SAndroid Build Coastguard Worker          NumberToString(trace_event::TraceLog::GetInstance()->process_id())});
100*6777b538SAndroid Build Coastguard Worker   } else {
101*6777b538SAndroid Build Coastguard Worker     process_name = StrCat(
102*6777b538SAndroid Build Coastguard Worker         {kProcessNamePrefix,
103*6777b538SAndroid Build Coastguard Worker          NumberToString(trace_event::TraceLog::GetInstance()->process_id())});
104*6777b538SAndroid Build Coastguard Worker   }
105*6777b538SAndroid Build Coastguard Worker   return process_name;
106*6777b538SAndroid Build Coastguard Worker }
107*6777b538SAndroid Build Coastguard Worker 
GetCurrentThreadId()108*6777b538SAndroid Build Coastguard Worker perfetto::base::PlatformThreadId PerfettoPlatform::GetCurrentThreadId() {
109*6777b538SAndroid Build Coastguard Worker   return base::PlatformThread::CurrentId();
110*6777b538SAndroid Build Coastguard Worker }
111*6777b538SAndroid Build Coastguard Worker 
112*6777b538SAndroid Build Coastguard Worker }  // namespace tracing
113*6777b538SAndroid Build Coastguard Worker }  // namespace base
114