1*6777b538SAndroid Build Coastguard Worker // Copyright 2018 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_TASK_RUNNER_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_TRACING_PERFETTO_TASK_RUNNER_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 9*6777b538SAndroid Build Coastguard Worker #include "base/cancelable_callback.h" 10*6777b538SAndroid Build Coastguard Worker #include "base/synchronization/lock.h" 11*6777b538SAndroid Build Coastguard Worker #include "base/task/sequenced_task_runner.h" 12*6777b538SAndroid Build Coastguard Worker #include "base/timer/timer.h" 13*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 14*6777b538SAndroid Build Coastguard Worker #include "third_party/perfetto/include/perfetto/base/task_runner.h" 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker #if (BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_NACL)) || BUILDFLAG(IS_FUCHSIA) 17*6777b538SAndroid Build Coastguard Worker // Needed for base::FileDescriptorWatcher::Controller and for implementing 18*6777b538SAndroid Build Coastguard Worker // AddFileDescriptorWatch & RemoveFileDescriptorWatch. 19*6777b538SAndroid Build Coastguard Worker #include <map> 20*6777b538SAndroid Build Coastguard Worker #include "base/files/file_descriptor_watcher_posix.h" 21*6777b538SAndroid Build Coastguard Worker #endif // (BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_NACL)) || BUILDFLAG(IS_FUCHSIA) 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker namespace base { 24*6777b538SAndroid Build Coastguard Worker namespace tracing { 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker // This wraps a base::TaskRunner implementation to be able 27*6777b538SAndroid Build Coastguard Worker // to provide it to Perfetto. 28*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT PerfettoTaskRunner : public perfetto::base::TaskRunner { 29*6777b538SAndroid Build Coastguard Worker public: 30*6777b538SAndroid Build Coastguard Worker explicit PerfettoTaskRunner( 31*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::SequencedTaskRunner> task_runner); 32*6777b538SAndroid Build Coastguard Worker ~PerfettoTaskRunner() override; 33*6777b538SAndroid Build Coastguard Worker PerfettoTaskRunner(const PerfettoTaskRunner&) = delete; 34*6777b538SAndroid Build Coastguard Worker void operator=(const PerfettoTaskRunner&) = delete; 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker // perfetto::base::TaskRunner implementation. Only called by 37*6777b538SAndroid Build Coastguard Worker // the Perfetto implementation itself. 38*6777b538SAndroid Build Coastguard Worker void PostTask(std::function<void()> task) override; 39*6777b538SAndroid Build Coastguard Worker void PostDelayedTask(std::function<void()> task, uint32_t delay_ms) override; 40*6777b538SAndroid Build Coastguard Worker // This in Chrome would more correctly be called "RunsTasksInCurrentSequence". 41*6777b538SAndroid Build Coastguard Worker // Perfetto calls this to determine wheather CommitData requests should be 42*6777b538SAndroid Build Coastguard Worker // flushed synchronously. RunsTasksInCurrentSequence is sufficient for that 43*6777b538SAndroid Build Coastguard Worker // use case. 44*6777b538SAndroid Build Coastguard Worker bool RunsTasksOnCurrentThread() const override; 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker void SetTaskRunner(scoped_refptr<base::SequencedTaskRunner> task_runner); 47*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::SequencedTaskRunner> GetOrCreateTaskRunner(); HasTaskRunner()48*6777b538SAndroid Build Coastguard Worker bool HasTaskRunner() const { return !!task_runner_; } 49*6777b538SAndroid Build Coastguard Worker 50*6777b538SAndroid Build Coastguard Worker // These are only used on Android when talking to the system Perfetto service. 51*6777b538SAndroid Build Coastguard Worker void AddFileDescriptorWatch(perfetto::base::PlatformHandle, 52*6777b538SAndroid Build Coastguard Worker std::function<void()>) override; 53*6777b538SAndroid Build Coastguard Worker void RemoveFileDescriptorWatch(perfetto::base::PlatformHandle) override; 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker // Tests will shut down all task runners in between runs, so we need 56*6777b538SAndroid Build Coastguard Worker // to re-create any static instances on each SetUp(); 57*6777b538SAndroid Build Coastguard Worker void ResetTaskRunnerForTesting( 58*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::SequencedTaskRunner> task_runner); 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Worker private: 61*6777b538SAndroid Build Coastguard Worker void OnDeferredTasksDrainTimer(); 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::SequencedTaskRunner> task_runner_; 64*6777b538SAndroid Build Coastguard Worker #if (BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_NACL)) || BUILDFLAG(IS_FUCHSIA) 65*6777b538SAndroid Build Coastguard Worker // FDControllerAndCallback keeps track of the state of FD watching: 66*6777b538SAndroid Build Coastguard Worker // * |controller| has value: FD watching is added. |callback| is nullopt. 67*6777b538SAndroid Build Coastguard Worker // * |controller| is nullptr: FD watching is pending for add. |callback| has 68*6777b538SAndroid Build Coastguard Worker // a value. 69*6777b538SAndroid Build Coastguard Worker // It's safe to call RemoveFileDescriptorWatch in either of the above states. 70*6777b538SAndroid Build Coastguard Worker // |controller| and |callback| can't be both non-null after returning from 71*6777b538SAndroid Build Coastguard Worker // AddFileDescriptorWatch or RemoveFileDescriptorWatch. 72*6777b538SAndroid Build Coastguard Worker struct FDControllerAndCallback { 73*6777b538SAndroid Build Coastguard Worker std::unique_ptr<base::FileDescriptorWatcher::Controller> controller; 74*6777b538SAndroid Build Coastguard Worker base::CancelableOnceClosure callback; 75*6777b538SAndroid Build Coastguard Worker 76*6777b538SAndroid Build Coastguard Worker FDControllerAndCallback(); 77*6777b538SAndroid Build Coastguard Worker ~FDControllerAndCallback(); 78*6777b538SAndroid Build Coastguard Worker }; 79*6777b538SAndroid Build Coastguard Worker std::map<int, FDControllerAndCallback> fd_controllers_; 80*6777b538SAndroid Build Coastguard Worker #endif // (BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_NACL)) || BUILDFLAG(IS_FUCHSIA) 81*6777b538SAndroid Build Coastguard Worker }; 82*6777b538SAndroid Build Coastguard Worker 83*6777b538SAndroid Build Coastguard Worker } // namespace tracing 84*6777b538SAndroid Build Coastguard Worker } // namespace base 85*6777b538SAndroid Build Coastguard Worker 86*6777b538SAndroid Build Coastguard Worker #endif // BASE_TRACING_PERFETTO_TASK_RUNNER_H_ 87