// Copyright 2018 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_TRACING_PERFETTO_TASK_RUNNER_H_ #define BASE_TRACING_PERFETTO_TASK_RUNNER_H_ #include "base/base_export.h" #include "base/cancelable_callback.h" #include "base/synchronization/lock.h" #include "base/task/sequenced_task_runner.h" #include "base/timer/timer.h" #include "build/build_config.h" #include "third_party/perfetto/include/perfetto/base/task_runner.h" #if (BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_NACL)) || BUILDFLAG(IS_FUCHSIA) // Needed for base::FileDescriptorWatcher::Controller and for implementing // AddFileDescriptorWatch & RemoveFileDescriptorWatch. #include #include "base/files/file_descriptor_watcher_posix.h" #endif // (BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_NACL)) || BUILDFLAG(IS_FUCHSIA) namespace base { namespace tracing { // This wraps a base::TaskRunner implementation to be able // to provide it to Perfetto. class BASE_EXPORT PerfettoTaskRunner : public perfetto::base::TaskRunner { public: explicit PerfettoTaskRunner( scoped_refptr task_runner); ~PerfettoTaskRunner() override; PerfettoTaskRunner(const PerfettoTaskRunner&) = delete; void operator=(const PerfettoTaskRunner&) = delete; // perfetto::base::TaskRunner implementation. Only called by // the Perfetto implementation itself. void PostTask(std::function task) override; void PostDelayedTask(std::function task, uint32_t delay_ms) override; // This in Chrome would more correctly be called "RunsTasksInCurrentSequence". // Perfetto calls this to determine wheather CommitData requests should be // flushed synchronously. RunsTasksInCurrentSequence is sufficient for that // use case. bool RunsTasksOnCurrentThread() const override; void SetTaskRunner(scoped_refptr task_runner); scoped_refptr GetOrCreateTaskRunner(); bool HasTaskRunner() const { return !!task_runner_; } // These are only used on Android when talking to the system Perfetto service. void AddFileDescriptorWatch(perfetto::base::PlatformHandle, std::function) override; void RemoveFileDescriptorWatch(perfetto::base::PlatformHandle) override; // Tests will shut down all task runners in between runs, so we need // to re-create any static instances on each SetUp(); void ResetTaskRunnerForTesting( scoped_refptr task_runner); private: void OnDeferredTasksDrainTimer(); scoped_refptr task_runner_; #if (BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_NACL)) || BUILDFLAG(IS_FUCHSIA) // FDControllerAndCallback keeps track of the state of FD watching: // * |controller| has value: FD watching is added. |callback| is nullopt. // * |controller| is nullptr: FD watching is pending for add. |callback| has // a value. // It's safe to call RemoveFileDescriptorWatch in either of the above states. // |controller| and |callback| can't be both non-null after returning from // AddFileDescriptorWatch or RemoveFileDescriptorWatch. struct FDControllerAndCallback { std::unique_ptr controller; base::CancelableOnceClosure callback; FDControllerAndCallback(); ~FDControllerAndCallback(); }; std::map fd_controllers_; #endif // (BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_NACL)) || BUILDFLAG(IS_FUCHSIA) }; } // namespace tracing } // namespace base #endif // BASE_TRACING_PERFETTO_TASK_RUNNER_H_