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 WorkerPerfettoPlatform::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 Workervoid 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 WorkerSequencedTaskRunner* 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 WorkerPerfettoPlatform::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 Workerstd::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 Workerstd::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 Workerperfetto::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