forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
perfetto_task_runner.h
86 lines (72 loc) · 3.48 KB
/
perfetto_task_runner.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// Copyright 2018 The Chromium Authors. All rights reserved.
// 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_forward.h"
#include "base/timer/timer.h"
#include "build/build_config.h"
#include "third_party/perfetto/include/perfetto/base/task_runner.h"
#if defined(OS_POSIX) && !defined(OS_NACL)
// Needed for base::FileDescriptorWatcher::Controller and for implementing
// AddFileDescriptorWatch & RemoveFileDescriptorWatch.
#include <map>
#include "base/files/file_descriptor_watcher_posix.h"
#endif // defined(OS_POSIX) && !defined(OS_NACL)
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<base::SequencedTaskRunner> 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<void()> task) override;
void PostDelayedTask(std::function<void()> 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<base::SequencedTaskRunner> task_runner);
scoped_refptr<base::SequencedTaskRunner> 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<void()>) 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<base::SequencedTaskRunner> task_runner);
private:
void OnDeferredTasksDrainTimer();
scoped_refptr<base::SequencedTaskRunner> task_runner_;
#if defined(OS_POSIX) && !defined(OS_NACL)
// 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<base::FileDescriptorWatcher::Controller> controller;
base::CancelableOnceClosure callback;
FDControllerAndCallback();
~FDControllerAndCallback();
};
std::map<int, FDControllerAndCallback> fd_controllers_;
#endif // defined(OS_POSIX) && !defined(OS_NACL)
};
} // namespace tracing
} // namespace base
#endif // BASE_TRACING_PERFETTO_TASK_RUNNER_H_