5#include "flutter/fml/trace_event.h"
11#include "flutter/fml/ascii_trie.h"
12#include "flutter/fml/build_config.h"
13#include "flutter/fml/logging.h"
18#if FLUTTER_TIMELINE_ENABLED
22int64_t DefaultMicrosSource() {
27std::atomic<TimelineEventHandler> gTimelineEventHandler;
28std::atomic<TimelineMicrosSource> gTimelineMicrosSource = DefaultMicrosSource;
30inline void FlutterTimelineEvent(
const char* label,
32 int64_t timestamp1_or_async_id,
33 intptr_t flow_id_count,
34 const int64_t* flow_ids,
37 const char** argument_names,
38 const char** argument_values) {
40 gTimelineEventHandler.load(std::memory_order_relaxed);
41 if (handler && gAllowlist.
Query(label)) {
42 handler(label, timestamp0, timestamp1_or_async_id, flow_id_count, flow_ids,
49 gAllowlist.Fill(allowlist);
53 gTimelineEventHandler = handler;
57 return static_cast<bool>(
58 gTimelineEventHandler.load(std::memory_order_relaxed));
62 return gTimelineMicrosSource.load()();
66 gTimelineMicrosSource =
source;
70 static std::atomic_size_t last_item;
76 int64_t timestamp_micros,
79 const uint64_t* flow_ids,
81 const std::vector<const char*>& c_names,
82 const std::vector<std::string>& values) {
83 const auto argument_count = std::min(c_names.size(), values.size());
85 std::vector<const char*> c_values;
89 c_values[i] = values[i].c_str();
97 reinterpret_cast<const int64_t*
>(flow_ids),
100 const_cast<const char**
>(c_names.data()),
108 size_t flow_id_count,
109 const uint64_t* flow_ids,
111 const std::vector<const char*>& c_names,
112 const std::vector<std::string>& values) {
115 gTimelineMicrosSource.load()(),
127 size_t flow_id_count,
128 const uint64_t* flow_ids) {
129 FlutterTimelineEvent(
name,
130 gTimelineMicrosSource.load()(),
133 reinterpret_cast<const int64_t*
>(flow_ids),
143 size_t flow_id_count,
144 const uint64_t* flow_ids,
147 const char* arg_names[] = {arg1_name};
148 const char* arg_values[] = {arg1_val};
149 FlutterTimelineEvent(
name,
150 gTimelineMicrosSource.load()(),
153 reinterpret_cast<const int64_t*
>(flow_ids),
163 size_t flow_id_count,
164 const uint64_t* flow_ids,
169 const char* arg_names[] = {arg1_name, arg2_name};
170 const char* arg_values[] = {arg1_val, arg2_val};
171 FlutterTimelineEvent(
name,
172 gTimelineMicrosSource.load()(),
175 reinterpret_cast<const int64_t*
>(flow_ids),
184 FlutterTimelineEvent(
name,
185 gTimelineMicrosSource.load()(),
199 size_t flow_id_count,
200 const uint64_t* flow_ids) {
201 FlutterTimelineEvent(
name,
202 gTimelineMicrosSource.load()(),
205 reinterpret_cast<const int64_t*
>(flow_ids),
216 FlutterTimelineEvent(
name,
217 gTimelineMicrosSource.load()(),
231 size_t flow_id_count,
232 const uint64_t* flow_ids,
235 const char* arg_names[] = {arg1_name};
236 const char* arg_values[] = {arg1_val};
237 FlutterTimelineEvent(
name,
238 gTimelineMicrosSource.load()(),
241 reinterpret_cast<const int64_t*
>(flow_ids),
254 const char* arg_names[] = {arg1_name};
255 const char* arg_values[] = {arg1_val};
256 FlutterTimelineEvent(
name,
257 gTimelineMicrosSource.load()(),
270 size_t flow_id_count,
271 const uint64_t* flow_ids) {
272 FlutterTimelineEvent(
name,
273 gTimelineMicrosSource.load()(),
276 reinterpret_cast<const int64_t*
>(flow_ids),
286 size_t flow_id_count,
287 const uint64_t* flow_ids,
290 const char* arg_names[] = {arg1_name};
291 const char* arg_values[] = {arg1_val};
292 FlutterTimelineEvent(
name,
293 gTimelineMicrosSource.load()(),
296 reinterpret_cast<const int64_t*
>(flow_ids),
306 size_t flow_id_count,
307 const uint64_t* flow_ids,
312 const char* arg_names[] = {arg1_name, arg2_name};
313 const char* arg_values[] = {arg1_val, arg2_val};
314 FlutterTimelineEvent(
name,
315 gTimelineMicrosSource.load()(),
318 reinterpret_cast<const int64_t*
>(flow_ids),
329 FlutterTimelineEvent(
name,
330 gTimelineMicrosSource.load()(),
344 FlutterTimelineEvent(
name,
345 gTimelineMicrosSource.load()(),
357 FlutterTimelineEvent(
name,
358 gTimelineMicrosSource.load()(),
391 int64_t timestamp_micros,
393 size_t flow_id_count,
394 const uint64_t* flow_ids,
396 const std::vector<const char*>& c_names,
397 const std::vector<std::string>& values) {}
402 size_t flow_id_count,
403 const uint64_t* flow_ids,
405 const std::vector<const char*>& c_names,
406 const std::vector<std::string>& values) {}
410 size_t flow_id_count,
411 const uint64_t* flow_ids) {}
415 size_t flow_id_count,
416 const uint64_t* flow_ids,
422 size_t flow_id_count,
423 const uint64_t* flow_ids,
439 size_t flow_id_count,
440 const uint64_t* flow_ids) {}
449 size_t flow_id_count,
450 const uint64_t* flow_ids,
462 size_t flow_id_count,
463 const uint64_t* flow_ids) {}
467 size_t flow_id_count,
468 const uint64_t* flow_ids,
474 size_t flow_id_count,
475 const uint64_t* flow_ids,
const char * data() const
A trie for looking for ASCII prefixes.
bool Query(const char *argument)
Returns true if argument is prefixed by the contents of the trie.
static SkString identifier(const FontFamilyDesc &family, const FontDesc &font)
static const char * begin(const StringSlice &s)
void TraceEventFlowEnd0(TraceArg category_group, TraceArg name, TraceIDArg id)
void TraceEventInstant0(TraceArg category_group, TraceArg name, size_t flow_id_count, const uint64_t *flow_ids)
void TraceEventFlowBegin0(TraceArg category_group, TraceArg name, TraceIDArg id)
bool TraceHasTimelineEventHandler()
void TraceEventAsyncBegin0(TraceArg category_group, TraceArg name, TraceIDArg id, size_t flow_id_count, const uint64_t *flow_ids)
void TraceSetAllowlist(const std::vector< std::string > &allowlist)
void TraceEventAsyncEnd0(TraceArg category_group, TraceArg name, TraceIDArg id)
void TraceEvent0(TraceArg category_group, TraceArg name, size_t flow_id_count, const uint64_t *flow_ids)
void TraceEventInstant1(TraceArg category_group, TraceArg name, size_t flow_id_count, const uint64_t *flow_ids, TraceArg arg1_name, TraceArg arg1_val)
int64_t(*)() TimelineMicrosSource
void TraceEventAsyncBegin1(TraceArg category_group, TraceArg name, TraceIDArg id, size_t flow_id_count, const uint64_t *flow_ids, TraceArg arg1_name, TraceArg arg1_val)
void TraceTimelineEvent(TraceArg category_group, TraceArg name, int64_t timestamp_micros, TraceIDArg identifier, size_t flow_id_count, const uint64_t *flow_ids, Dart_Timeline_Event_Type type, const std::vector< const char * > &c_names, const std::vector< std::string > &values)
void TraceSetTimelineEventHandler(TimelineEventHandler handler)
void TraceSetTimelineMicrosSource(TimelineMicrosSource source)
void TraceEvent2(TraceArg category_group, TraceArg name, size_t flow_id_count, const uint64_t *flow_ids, TraceArg arg1_name, TraceArg arg1_val, TraceArg arg2_name, TraceArg arg2_val)
void TraceEventAsyncEnd1(TraceArg category_group, TraceArg name, TraceIDArg id, TraceArg arg1_name, TraceArg arg1_val)
void TraceEventEnd(TraceArg name)
void TraceEventInstant2(TraceArg category_group, TraceArg name, size_t flow_id_count, const uint64_t *flow_ids, TraceArg arg1_name, TraceArg arg1_val, TraceArg arg2_name, TraceArg arg2_val)
int64_t TraceGetTimelineMicros()
void TraceEvent1(TraceArg category_group, TraceArg name, size_t flow_id_count, const uint64_t *flow_ids, TraceArg arg1_name, TraceArg arg1_val)
void(* TimelineEventHandler)(const char *, int64_t, int64_t, intptr_t, const int64_t *, Dart_Timeline_Event_Type, intptr_t, const char **, const char **)
void TraceEventAsyncComplete(TraceArg category_group, TraceArg name, TimePoint begin, TimePoint end)
void TraceEventFlowStep0(TraceArg category_group, TraceArg name, TraceIDArg id)