From 7438e9d4335e4f0228dd796ca4d7a1b8a0484e17 Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Wed, 16 Mar 2022 13:42:17 -0700 Subject: [PATCH] Wrap the global timeline event handler callback in a std::atomic Fixes https://github.com/flutter/flutter/issues/100238 --- fml/trace_event.cc | 10 ++++++---- fml/trace_event.h | 14 +++++++------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/fml/trace_event.cc b/fml/trace_event.cc index 8ee1bed590504..20acb36306aa2 100644 --- a/fml/trace_event.cc +++ b/fml/trace_event.cc @@ -19,7 +19,7 @@ namespace tracing { namespace { AsciiTrie gAllowlist; -TimelineEventHandler gTimelineEventHandler; +std::atomic gTimelineEventHandler; inline void FlutterTimelineEvent(const char* label, int64_t timestamp0, @@ -28,9 +28,11 @@ inline void FlutterTimelineEvent(const char* label, intptr_t argument_count, const char** argument_names, const char** argument_values) { - if (gTimelineEventHandler && gAllowlist.Query(label)) { - gTimelineEventHandler(label, timestamp0, timestamp1_or_async_id, type, - argument_count, argument_names, argument_values); + TimelineEventHandler handler = + gTimelineEventHandler.load(std::memory_order_relaxed); + if (handler && gAllowlist.Query(label)) { + handler(label, timestamp0, timestamp1_or_async_id, type, argument_count, + argument_names, argument_values); } } } // namespace diff --git a/fml/trace_event.h b/fml/trace_event.h index d89e421a7bec6..2c41ce45c3a72 100644 --- a/fml/trace_event.h +++ b/fml/trace_event.h @@ -147,13 +147,13 @@ using TraceIDArg = int64_t; void TraceSetAllowlist(const std::vector& allowlist); -using TimelineEventHandler = std::function; +typedef void (*TimelineEventHandler)(const char*, + int64_t, + int64_t, + Dart_Timeline_Event_Type, + intptr_t, + const char**, + const char**); void TraceSetTimelineEventHandler(TimelineEventHandler handler);