1 // Copyright 2020 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef BASE_TRACE_EVENT_TRACE_EVENT_STUB_H_
6 #define BASE_TRACE_EVENT_TRACE_EVENT_STUB_H_
7
8 #include <stddef.h>
9
10 #include <cstdint>
11 #include <memory>
12 #include <string>
13 #include <string_view>
14
15 #include "base/base_export.h"
16 #include "base/trace_event/common/trace_event_common.h"
17 #include "base/trace_event/memory_allocator_dump_guid.h"
18 #include "base/values.h"
19
20 #define TRACE_STR_COPY(str) str
21 #define TRACE_ID_WITH_SCOPE(scope, ...) 0
22 #define TRACE_ID_GLOBAL(id) 0
23 #define TRACE_ID_LOCAL(id) 0
24
25 namespace trace_event_internal {
26
27 const unsigned long long kNoId = 0;
28
29 template <typename... Args>
Ignore(Args &&...args)30 void Ignore(Args&&... args) {}
31
32 struct IgnoredValue {
33 template <typename... Args>
IgnoredValueIgnoredValue34 IgnoredValue(Args&&... args) {}
35 };
36
37 } // namespace trace_event_internal
38
39 #define INTERNAL_TRACE_IGNORE(...) \
40 (false ? trace_event_internal::Ignore(__VA_ARGS__) : (void)0)
41
42 #define INTERNAL_TRACE_EVENT_ADD(...) INTERNAL_TRACE_IGNORE(__VA_ARGS__)
43 #define INTERNAL_TRACE_EVENT_ADD_SCOPED(...) INTERNAL_TRACE_IGNORE(__VA_ARGS__)
44 #define INTERNAL_TRACE_EVENT_ADD_WITH_ID(...) INTERNAL_TRACE_IGNORE(__VA_ARGS__)
45 #define INTERNAL_TRACE_EVENT_ADD_SCOPED_WITH_FLOW(...) \
46 INTERNAL_TRACE_IGNORE(__VA_ARGS__)
47 #define INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(...) \
48 INTERNAL_TRACE_IGNORE(__VA_ARGS__)
49 #define INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMPS(...) \
50 INTERNAL_TRACE_IGNORE(__VA_ARGS__)
51
52 // Defined in application_state_proto_android.h
53 #define TRACE_APPLICATION_STATE(...) INTERNAL_TRACE_IGNORE(__VA_ARGS__)
54
55 #define TRACE_HEAP_PROFILER_API_SCOPED_TASK_EXECUTION \
56 trace_event_internal::IgnoredValue
57
58 #define TRACE_ID_MANGLE(val) (val)
59
60 #define INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(cat) INTERNAL_TRACE_IGNORE(cat);
61 #define INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE() false
62
63 #define TRACE_EVENT_API_CURRENT_THREAD_ID 0
64
65 // Typed macros. For these, we have to erase the extra args entirely, as they
66 // may include a lambda that refers to protozero message types (which aren't
67 // available in the stub). This may trigger "unused variable" errors at the
68 // callsite, which have to be addressed at the callsite (e.g. via
69 // [[maybe_unused]]).
70 #define TRACE_EVENT_BEGIN(category, name, ...) \
71 INTERNAL_TRACE_IGNORE(category, name)
72 #define TRACE_EVENT_END(category, ...) INTERNAL_TRACE_IGNORE(category)
73 #define TRACE_EVENT(category, name, ...) INTERNAL_TRACE_IGNORE(category, name)
74 #define TRACE_EVENT_INSTANT(category, name, ...) \
75 INTERNAL_TRACE_IGNORE(category, name)
76 #define PERFETTO_INTERNAL_ADD_EMPTY_EVENT() INTERNAL_TRACE_IGNORE()
77
78 namespace base {
79 namespace trace_event {
80
81 class BASE_EXPORT ConvertableToTraceFormat {
82 public:
83 ConvertableToTraceFormat() = default;
84 ConvertableToTraceFormat(const ConvertableToTraceFormat&) = delete;
85 ConvertableToTraceFormat& operator=(const ConvertableToTraceFormat&) = delete;
86 virtual ~ConvertableToTraceFormat();
87
88 // Append the class info to the provided |out| string. The appended
89 // data must be a valid JSON object. Strings must be properly quoted, and
90 // escaped. There is no processing applied to the content after it is
91 // appended.
92 virtual void AppendAsTraceFormat(std::string* out) const = 0;
93 };
94
95 class BASE_EXPORT TracedValue : public ConvertableToTraceFormat {
96 public:
97 explicit TracedValue(size_t capacity = 0) {}
98
EndDictionary()99 void EndDictionary() {}
EndArray()100 void EndArray() {}
101
SetInteger(const char * name,int value)102 void SetInteger(const char* name, int value) {}
SetDouble(const char * name,double value)103 void SetDouble(const char* name, double value) {}
SetBoolean(const char * name,bool value)104 void SetBoolean(const char* name, bool value) {}
SetString(const char * name,std::string_view value)105 void SetString(const char* name, std::string_view value) {}
SetValue(const char * name,TracedValue * value)106 void SetValue(const char* name, TracedValue* value) {}
BeginDictionary(const char * name)107 void BeginDictionary(const char* name) {}
BeginArray(const char * name)108 void BeginArray(const char* name) {}
109
SetIntegerWithCopiedName(std::string_view name,int value)110 void SetIntegerWithCopiedName(std::string_view name, int value) {}
SetDoubleWithCopiedName(std::string_view name,double value)111 void SetDoubleWithCopiedName(std::string_view name, double value) {}
SetBooleanWithCopiedName(std::string_view name,bool value)112 void SetBooleanWithCopiedName(std::string_view name, bool value) {}
SetStringWithCopiedName(std::string_view name,std::string_view value)113 void SetStringWithCopiedName(std::string_view name, std::string_view value) {}
SetValueWithCopiedName(std::string_view name,TracedValue * value)114 void SetValueWithCopiedName(std::string_view name, TracedValue* value) {}
BeginDictionaryWithCopiedName(std::string_view name)115 void BeginDictionaryWithCopiedName(std::string_view name) {}
BeginArrayWithCopiedName(std::string_view name)116 void BeginArrayWithCopiedName(std::string_view name) {}
117
AppendInteger(int)118 void AppendInteger(int) {}
AppendDouble(double)119 void AppendDouble(double) {}
AppendBoolean(bool)120 void AppendBoolean(bool) {}
AppendString(std::string_view)121 void AppendString(std::string_view) {}
BeginArray()122 void BeginArray() {}
BeginDictionary()123 void BeginDictionary() {}
124
125 void AppendAsTraceFormat(std::string* out) const override;
126 };
127
128 class BASE_EXPORT TracedValueJSON : public TracedValue {
129 public:
TracedValue(capacity)130 explicit TracedValueJSON(size_t capacity = 0) : TracedValue(capacity) {}
131
ToBaseValue()132 std::unique_ptr<base::Value> ToBaseValue() const { return nullptr; }
ToJSON()133 std::string ToJSON() const { return ""; }
ToFormattedJSON()134 std::string ToFormattedJSON() const { return ""; }
135 };
136
137 struct MemoryDumpArgs;
138 class ProcessMemoryDump;
139
140 class BASE_EXPORT MemoryDumpProvider {
141 public:
142 MemoryDumpProvider(const MemoryDumpProvider&) = delete;
143 MemoryDumpProvider& operator=(const MemoryDumpProvider&) = delete;
144 virtual ~MemoryDumpProvider();
145
146 virtual bool OnMemoryDump(const MemoryDumpArgs& args,
147 ProcessMemoryDump* pmd) = 0;
148
149 protected:
150 MemoryDumpProvider() = default;
151 };
152
153 class BASE_EXPORT MemoryDumpManager {
154 public:
155 static constexpr const char* const kTraceCategory =
156 TRACE_DISABLED_BY_DEFAULT("memory-infra");
157 };
158
GetNextGlobalTraceId()159 inline uint64_t GetNextGlobalTraceId() {
160 return 0;
161 }
162
163 } // namespace trace_event
164 } // namespace base
165
166 // Stub implementation for
167 // perfetto::StaticString/ThreadTrack/TracedValue/TracedDictionary/TracedArray/
168 // Track.
169 namespace perfetto {
170
171 class TracedArray;
172 class TracedDictionary;
173 class EventContext;
174
175 class StaticString {
176 public:
177 template <typename T>
StaticString(T)178 StaticString(T) {}
179 };
180
181 class DynamicString {
182 public:
183 template <typename T>
DynamicString(T)184 explicit DynamicString(T) {}
185 };
186
187 class TracedValue {
188 public:
WriteInt64(int64_t)189 void WriteInt64(int64_t) && {}
WriteUInt64(uint64_t)190 void WriteUInt64(uint64_t) && {}
WriteDouble(double)191 void WriteDouble(double) && {}
WriteBoolean(bool)192 void WriteBoolean(bool) && {}
WriteString(const char *)193 void WriteString(const char*) && {}
WriteString(const char *,size_t)194 void WriteString(const char*, size_t) && {}
WriteString(const std::string &)195 void WriteString(const std::string&) && {}
WritePointer(const void *)196 void WritePointer(const void*) && {}
197
198 TracedDictionary WriteDictionary() &&;
199 TracedArray WriteArray() &&;
200 };
201
202 class TracedDictionary {
203 public:
AddItem(StaticString)204 TracedValue AddItem(StaticString) { return TracedValue(); }
AddItem(DynamicString)205 TracedValue AddItem(DynamicString) { return TracedValue(); }
206
207 template <typename T>
Add(StaticString,T &&)208 void Add(StaticString, T&&) {}
209 template <typename T>
Add(DynamicString,T &&)210 void Add(DynamicString, T&&) {}
211
212 TracedDictionary AddDictionary(StaticString);
213 TracedDictionary AddDictionary(DynamicString);
214 TracedArray AddArray(StaticString);
215 TracedArray AddArray(DynamicString);
216 };
217
218 class TracedArray {
219 public:
AppendItem()220 TracedValue AppendItem() { return TracedValue(); }
221
222 template <typename T>
Append(T &&)223 void Append(T&&) {}
224
225 TracedDictionary AppendDictionary();
226 TracedArray AppendArray();
227 };
228
229 template <class T>
WriteIntoTracedValue(TracedValue,T &&)230 void WriteIntoTracedValue(TracedValue, T&&) {}
231
232 struct Track {
TrackTrack233 explicit Track(uint64_t id) {}
234 };
235
236 namespace protos::pbzero {
237 namespace SequenceManagerTask {
238
239 enum class QueueName {
240 UNKNOWN_TQ = 0,
241 DEFAULT_TQ = 1,
242 TASK_ENVIRONMENT_DEFAULT_TQ = 2,
243 TEST2_TQ = 3,
244 TEST_TQ = 4,
245 };
QueueName_Name(QueueName value)246 inline const char* QueueName_Name(QueueName value) {
247 switch (value) {
248 case QueueName::UNKNOWN_TQ:
249 return "UNKNOWN_TQ";
250 case QueueName::DEFAULT_TQ:
251 return "DEFAULT_TQ";
252 case QueueName::TASK_ENVIRONMENT_DEFAULT_TQ:
253 return "TASK_ENVIRONMENT_DEFAULT_TQ";
254 case QueueName::TEST2_TQ:
255 return "TEST2_TQ";
256 case QueueName::TEST_TQ:
257 return "TEST_TQ";
258 }
259 }
260
261 } // namespace SequenceManagerTask
262
263 namespace ChromeProcessDescriptor {
264
265 enum ProcessType {};
266
267 } // namespace ChromeProcessDescriptor
268
269 } // namespace protos::pbzero
270 } // namespace perfetto
271
272 #endif // BASE_TRACE_EVENT_TRACE_EVENT_STUB_H_
273