5 #ifndef FLUTTER_FML_TRACE_EVENT_H_ 6 #define FLUTTER_FML_TRACE_EVENT_H_ 10 #include "flutter/fml/build_config.h" 12 #if defined(OS_FUCHSIA) 16 #include <lib/trace/event.h> 20 #define FML_TRACE_COUNTER(a, b, c, arg1, ...) \ 21 ::fml::tracing::TraceCounterNopHACK((a), (b), (c), (arg1), __VA_ARGS__); 23 #define FML_TRACE_EVENT(a, b, args...) TRACE_DURATION(a, b) 25 #define TRACE_EVENT0(a, b) TRACE_DURATION(a, b) 26 #define TRACE_EVENT1(a, b, c, d) TRACE_DURATION(a, b, c, d) 27 #define TRACE_EVENT2(a, b, c, d, e, f) TRACE_DURATION(a, b, c, d, e, f) 28 #define TRACE_EVENT_ASYNC_BEGIN0(a, b, c) TRACE_ASYNC_BEGIN(a, b, c) 29 #define TRACE_EVENT_ASYNC_END0(a, b, c) TRACE_ASYNC_END(a, b, c) 30 #define TRACE_EVENT_ASYNC_BEGIN1(a, b, c, d, e) TRACE_ASYNC_BEGIN(a, b, c, d, e) 31 #define TRACE_EVENT_ASYNC_END1(a, b, c, d, e) TRACE_ASYNC_END(a, b, c, d, e) 32 #define TRACE_EVENT_INSTANT0(a, b) TRACE_INSTANT(a, b, TRACE_SCOPE_THREAD) 33 #define TRACE_EVENT_INSTANT1(a, b, k1, v1) \ 34 TRACE_INSTANT(a, b, TRACE_SCOPE_THREAD, k1, v1) 35 #define TRACE_EVENT_INSTANT2(a, b, k1, v1, k2, v2) \ 36 TRACE_INSTANT(a, b, TRACE_SCOPE_THREAD, k1, v1, k2, v2) 38 #endif // defined(OS_FUCHSIA) 43 #include <type_traits> 46 #include "flutter/fml/macros.h" 47 #include "flutter/fml/time/time_point.h" 48 #include "third_party/dart/runtime/include/dart_tools_api.h" 50 #if (FLUTTER_RELEASE && !defined(OS_FUCHSIA) && !defined(FML_OS_ANDROID)) 51 #define FLUTTER_TIMELINE_ENABLED 0 53 #define FLUTTER_TIMELINE_ENABLED 1 56 #if !defined(OS_FUCHSIA) 57 #ifndef TRACE_EVENT_HIDE_MACROS 59 #define __FML__TOKEN_CAT__(x, y) x##y 60 #define __FML__TOKEN_CAT__2(x, y) __FML__TOKEN_CAT__(x, y) 61 #define __FML__AUTO_TRACE_END(name) \ 62 ::fml::tracing::ScopedInstantEnd __FML__TOKEN_CAT__2(__trace_end_, \ 69 #define FML_TRACE_COUNTER(category_group, name, counter_id, arg1, ...) \ 70 ::fml::tracing::TraceCounter((category_group), (name), (counter_id), (arg1), \ 86 #define FML_TRACE_EVENT(category_group, name, ...) \ 87 ::fml::tracing::TraceEvent((category_group), (name), __VA_ARGS__); \ 88 __FML__AUTO_TRACE_END(name) 90 #define TRACE_EVENT0(category_group, name) \ 91 ::fml::tracing::TraceEvent0(category_group, name); \ 92 __FML__AUTO_TRACE_END(name) 94 #define TRACE_EVENT1(category_group, name, arg1_name, arg1_val) \ 95 ::fml::tracing::TraceEvent1(category_group, name, arg1_name, arg1_val); \ 96 __FML__AUTO_TRACE_END(name) 98 #define TRACE_EVENT2(category_group, name, arg1_name, arg1_val, arg2_name, \ 100 ::fml::tracing::TraceEvent2(category_group, name, arg1_name, arg1_val, \ 101 arg2_name, arg2_val); \ 102 __FML__AUTO_TRACE_END(name) 104 #define TRACE_EVENT_ASYNC_BEGIN0(category_group, name, id) \ 105 ::fml::tracing::TraceEventAsyncBegin0(category_group, name, id); 107 #define TRACE_EVENT_ASYNC_END0(category_group, name, id) \ 108 ::fml::tracing::TraceEventAsyncEnd0(category_group, name, id); 110 #define TRACE_EVENT_ASYNC_BEGIN1(category_group, name, id, arg1_name, \ 112 ::fml::tracing::TraceEventAsyncBegin1(category_group, name, id, arg1_name, \ 115 #define TRACE_EVENT_ASYNC_END1(category_group, name, id, arg1_name, arg1_val) \ 116 ::fml::tracing::TraceEventAsyncEnd1(category_group, name, id, arg1_name, \ 119 #define TRACE_EVENT_INSTANT0(category_group, name) \ 120 ::fml::tracing::TraceEventInstant0(category_group, name); 122 #define TRACE_EVENT_INSTANT1(category_group, name, arg1_name, arg1_val) \ 123 ::fml::tracing::TraceEventInstant1(category_group, name, arg1_name, arg1_val); 125 #define TRACE_EVENT_INSTANT2(category_group, name, arg1_name, arg1_val, \ 126 arg2_name, arg2_val) \ 127 ::fml::tracing::TraceEventInstant2(category_group, name, arg1_name, \ 128 arg1_val, arg2_name, arg2_val); 130 #define TRACE_FLOW_BEGIN(category, name, id) \ 131 ::fml::tracing::TraceEventFlowBegin0(category, name, id); 133 #define TRACE_FLOW_STEP(category, name, id) \ 134 ::fml::tracing::TraceEventFlowStep0(category, name, id); 136 #define TRACE_FLOW_END(category, name, id) \ 137 ::fml::tracing::TraceEventFlowEnd0(category, name, id); 139 #endif // TRACE_EVENT_HIDE_MACROS 140 #endif // !defined(OS_FUCHSIA) 153 Dart_Timeline_Event_Type,
170 int64_t timestamp_micros,
172 Dart_Timeline_Event_Type
type,
173 const std::vector<const char*>& names,
174 const std::vector<std::string>& values);
179 Dart_Timeline_Event_Type
type,
180 const std::vector<const char*>& names,
181 const std::vector<std::string>& values);
184 return std::string{
string};
197 return std::to_string(
string);
201 std::vector<std::string>& values) {}
203 template <
typename Key,
typename Value,
typename... Args>
205 std::vector<std::string>& values,
209 keys.emplace_back(key);
214 inline std::pair<std::vector<const char*>, std::vector<std::string>>
219 template <
typename Key,
typename Value,
typename... Args>
220 std::pair<std::vector<const char*>, std::vector<std::string>>
222 std::vector<const char*> keys;
223 std::vector<std::string> values;
225 return std::make_pair(std::move(keys), std::move(values));
230 template <
typename... Args>
235 #if FLUTTER_TIMELINE_ENABLED 238 split.first, split.second);
239 #endif // FLUTTER_TIMELINE_ENABLED 244 template <
typename... Args>
250 template <
typename... Args>
252 #if FLUTTER_TIMELINE_ENABLED 256 #endif // FLUTTER_TIMELINE_ENABLED 275 template <
typename... Args>
281 #if FLUTTER_TIMELINE_ENABLED 296 Dart_Timeline_Event_Async_Begin,
305 Dart_Timeline_Event_Async_End,
309 #endif // FLUTTER_TIMELINE_ENABLED 371 explicit TraceFlow(
const char* label) : label_(label), nonce_(TraceNonce()) {
381 void Step(
const char* label =
nullptr)
const {
385 void End(
const char* label =
nullptr) {
402 #endif // FLUTTER_FML_TRACE_EVENT_H_ int64_t TraceGetTimelineMicros()
G_BEGIN_DECLS FlValue * args
void TraceEventInstant1(TraceArg category_group, TraceArg name, TraceArg arg1_name, TraceArg arg1_val)
void TraceEventAsyncEnd0(TraceArg category_group, TraceArg name, TraceIDArg id)
void TraceCounter(TraceArg category, TraceArg name, TraceIDArg identifier, Args... args)
bool TraceHasTimelineEventHandler()
void TraceEventEnd(TraceArg name)
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir Path to the cache directory This is different from the persistent_cache_path in embedder which is used for Skia shader cache icu native lib Path to the library file that exports the ICU data observatory The hostname IP address on which the Dart Observatory should be served If not defaults to or::depending on whether ipv6 is specified disable Disable the Dart Observatory The observatory is never available in release mode Bind to the IPv6 localhost address for the Dart Observatory Ignored if observatory host is set endless trace Enable an endless trace buffer The default is a ring buffer This is useful when very old events need to viewed For during application launch Memory usage will continue to grow indefinitely however Start app with an specific route defined on the framework flutter assets Path to the Flutter assets directory enable service port Allow the VM service to fallback to automatic port selection if binding to a specified port fails trace Trace early application lifecycle Automatically switches to an endless trace buffer trace skia allowlist
int64_t(*)() TimelineMicrosSource
TraceFlow(TraceFlow &&other)
enum flutter::testing::@1969::KeyboardChange::Type type
TraceFlow(const char *label)
DEF_SWITCHES_START aot vmservice shared library name
void TraceEventFlowBegin0(TraceArg category_group, TraceArg name, TraceIDArg id)
TimeDelta ToEpochDelta() const
void TraceTimelineEvent(TraceArg category_group, TraceArg name, int64_t timestamp_micros, TraceIDArg identifier, Dart_Timeline_Event_Type type, const std::vector< const char *> &c_names, const std::vector< std::string > &values)
void swap(scoped_nsprotocol< C > &p1, scoped_nsprotocol< C > &p2)
void TraceEvent1(TraceArg category_group, TraceArg name, TraceArg arg1_name, TraceArg arg1_val)
void TraceEventFlowEnd0(TraceArg category_group, TraceArg name, TraceIDArg id)
void TraceEventInstant0(TraceArg category_group, TraceArg name)
std::pair< std::vector< const char * >, std::vector< std::string > > SplitArguments()
constexpr int64_t ToMicroseconds() const
void TraceEventAsyncEnd1(TraceArg category_group, TraceArg name, TraceIDArg id, TraceArg arg1_name, TraceArg arg1_val)
void End(const char *label=nullptr)
void Step(const char *label=nullptr) const
void TraceEventFlowStep0(TraceArg category_group, TraceArg name, TraceIDArg id)
void(* TimelineEventHandler)(const char *, int64_t, int64_t, Dart_Timeline_Event_Type, intptr_t, const char **, const char **)
void TraceSetTimelineEventHandler(TimelineEventHandler handler)
void TraceCounterNopHACK(TraceArg category, TraceArg name, TraceIDArg identifier, Args... args)
ScopedInstantEnd(const char *str)
constexpr int64_t ToNanoseconds() const
void TraceSetAllowlist(const std::vector< std::string > &allowlist)
void TraceSetTimelineMicrosSource(TimelineMicrosSource source)
void TraceEvent2(TraceArg category_group, TraceArg name, TraceArg arg1_name, TraceArg arg1_val, TraceArg arg2_name, TraceArg arg2_val)
void TraceEventAsyncBegin0(TraceArg category_group, TraceArg name, TraceIDArg id)
void TraceEvent(TraceArg category, TraceArg name, Args... args)
std::string TraceToString(const char *string)
void SplitArgumentsCollect(std::vector< const char *> &keys, std::vector< std::string > &values)
void TraceEventInstant2(TraceArg category_group, TraceArg name, TraceArg arg1_name, TraceArg arg1_val, TraceArg arg2_name, TraceArg arg2_val)
void TraceEventAsyncComplete(TraceArg category_group, TraceArg name, TimePoint begin, TimePoint end)
#define FML_DISALLOW_COPY_AND_ASSIGN(TypeName)
void TraceEvent0(TraceArg category_group, TraceArg name)
void TraceEventAsyncBegin1(TraceArg category_group, TraceArg name, TraceIDArg id, TraceArg arg1_name, TraceArg arg1_val)