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 #ifndef BASE_TRACING_PERFETTO_PLATFORM_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_TRACING_PERFETTO_PLATFORM_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include "third_party/perfetto/include/perfetto/base/thread_utils.h" 9*6777b538SAndroid Build Coastguard Worker #include "third_party/perfetto/include/perfetto/tracing/platform.h" 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 12*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread_local_storage.h" 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker namespace base { 16*6777b538SAndroid Build Coastguard Worker class DeferredSequencedTaskRunner; 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker namespace tracing { 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT PerfettoPlatform : public perfetto::Platform { 21*6777b538SAndroid Build Coastguard Worker public: 22*6777b538SAndroid Build Coastguard Worker // Specifies the type of task runner used by Perfetto. 23*6777b538SAndroid Build Coastguard Worker // TODO(skyostil): Move all scenarios to use the default task runner to 24*6777b538SAndroid Build Coastguard Worker // avoid problems with unexpected re-entrancy and IPC deadlocks. 25*6777b538SAndroid Build Coastguard Worker enum class TaskRunnerType { 26*6777b538SAndroid Build Coastguard Worker // Use Perfetto's own task runner which runs tasks on a dedicated (internal) 27*6777b538SAndroid Build Coastguard Worker // thread. 28*6777b538SAndroid Build Coastguard Worker kBuiltin, 29*6777b538SAndroid Build Coastguard Worker // Use base::ThreadPool. 30*6777b538SAndroid Build Coastguard Worker kThreadPool, 31*6777b538SAndroid Build Coastguard Worker }; 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker explicit PerfettoPlatform(TaskRunnerType = TaskRunnerType::kThreadPool); 34*6777b538SAndroid Build Coastguard Worker ~PerfettoPlatform() override; 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker SequencedTaskRunner* task_runner() const; did_start_task_runner()37*6777b538SAndroid Build Coastguard Worker bool did_start_task_runner() const { return did_start_task_runner_; } 38*6777b538SAndroid Build Coastguard Worker void StartTaskRunner(scoped_refptr<SequencedTaskRunner>); 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker // perfetto::Platform implementation: 41*6777b538SAndroid Build Coastguard Worker ThreadLocalObject* GetOrCreateThreadLocalObject() override; 42*6777b538SAndroid Build Coastguard Worker std::unique_ptr<perfetto::base::TaskRunner> CreateTaskRunner( 43*6777b538SAndroid Build Coastguard Worker const CreateTaskRunnerArgs&) override; 44*6777b538SAndroid Build Coastguard Worker std::string GetCurrentProcessName() override; 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker // Chrome uses different thread IDs than Perfetto on Mac. So we need to 47*6777b538SAndroid Build Coastguard Worker // override this method to keep Perfetto tracks consistent with Chrome 48*6777b538SAndroid Build Coastguard Worker // thread IDs. 49*6777b538SAndroid Build Coastguard Worker perfetto::base::PlatformThreadId GetCurrentThreadId() override; 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker private: 52*6777b538SAndroid Build Coastguard Worker const TaskRunnerType task_runner_type_; 53*6777b538SAndroid Build Coastguard Worker scoped_refptr<DeferredSequencedTaskRunner> deferred_task_runner_; 54*6777b538SAndroid Build Coastguard Worker bool did_start_task_runner_ = false; 55*6777b538SAndroid Build Coastguard Worker ThreadLocalStorage::Slot thread_local_object_; 56*6777b538SAndroid Build Coastguard Worker }; 57*6777b538SAndroid Build Coastguard Worker 58*6777b538SAndroid Build Coastguard Worker } // namespace tracing 59*6777b538SAndroid Build Coastguard Worker } // namespace base 60*6777b538SAndroid Build Coastguard Worker 61*6777b538SAndroid Build Coastguard Worker #endif // BASE_TRACING_PERFETTO_PLATFORM_H_ 62