xref: /aosp_15_r20/external/cronet/base/tracing/perfetto_task_runner.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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