@@ -669,7 +669,7 @@ void TimelineEvent::Init(EventType event_type, const char* label) {
669669}
670670
671671bool TimelineEvent::Within (int64_t time_origin_micros,
672- int64_t time_extent_micros) {
672+ int64_t time_extent_micros) const {
673673 if ((time_origin_micros == -1 ) || (time_extent_micros == -1 )) {
674674 // No time range specified.
675675 return true ;
@@ -1610,9 +1610,8 @@ intptr_t TimelineEventFixedBufferRecorder::Size() {
16101610}
16111611
16121612#ifndef PRODUCT
1613- void TimelineEventFixedBufferRecorder::PrintEventsCommon (
1614- const TimelineEventFilter& filter,
1615- std::function<void (const TimelineEvent&)>&& print_impl) {
1613+ void TimelineEventFixedBufferRecorder::ForEachNonEmptyBlock (
1614+ std::function<void (const TimelineEventBlock&)>&& handle_block) {
16161615 // Acquire the recorder's lock to prevent the reclaimed blocks from being
16171616 // handed out again until the trace has been serialized.
16181617 MutexLocker ml (&lock_);
@@ -1629,20 +1628,30 @@ void TimelineEventFixedBufferRecorder::PrintEventsCommon(
16291628 if (!block->ContainsEventsThatCanBeSerializedLocked ()) {
16301629 continue ;
16311630 }
1632- for (intptr_t event_idx = 0 ; event_idx < block->length (); event_idx++) {
1633- TimelineEvent* event = block->At (event_idx);
1634- if (filter.IncludeEvent (event) &&
1635- event->Within (filter.time_origin_micros (),
1636- filter.time_extent_micros ())) {
1637- ReportTime (event->LowTime ());
1638- ReportTime (event->HighTime ());
1639- print_impl (*event);
1640- }
1641- }
1631+ handle_block (*block);
16421632 }
16431633}
16441634
1645- void TimelineEventFixedBufferRecorder::PrintJSONEvents (
1635+ void TimelineEventBufferedRecorder::PrintEventsCommon (
1636+ const TimelineEventFilter& filter,
1637+ std::function<void (const TimelineEvent&)>&& print_impl) {
1638+ ForEachNonEmptyBlock (
1639+ [this , &filter, print_impl = std::move (print_impl)](auto & block) {
1640+ for (intptr_t event_idx = 0 , length = block.length ();
1641+ event_idx < length; event_idx++) {
1642+ auto event = block.At (event_idx);
1643+ if (filter.IncludeEvent (event) &&
1644+ event->Within (filter.time_origin_micros (),
1645+ filter.time_extent_micros ())) {
1646+ ReportTime (event->LowTime ());
1647+ ReportTime (event->HighTime ());
1648+ print_impl (*event);
1649+ }
1650+ }
1651+ });
1652+ }
1653+
1654+ void TimelineEventBufferedRecorder::PrintJSONEvents (
16461655 const JSONArray& events,
16471656 const TimelineEventFilter& filter) {
16481657 PrintEventsCommon (filter, [&events](const TimelineEvent& event) {
@@ -1704,7 +1713,7 @@ inline void PrintPerfettoEventCallbackBody(
17041713 heap_buffered_packet->Reset ();
17051714}
17061715
1707- void TimelineEventFixedBufferRecorder ::PrintPerfettoEvents (
1716+ void TimelineEventBufferedRecorder ::PrintPerfettoEvents (
17081717 JSONBase64String* jsonBase64String,
17091718 const TimelineEventFilter& filter) {
17101719 PrintEventsCommon (
@@ -1721,8 +1730,8 @@ void TimelineEventFixedBufferRecorder::PrintPerfettoEvents(
17211730}
17221731#endif // defined(SUPPORT_PERFETTO)
17231732
1724- void TimelineEventFixedBufferRecorder ::PrintJSON (JSONStream* js,
1725- TimelineEventFilter* filter) {
1733+ void TimelineEventBufferedRecorder ::PrintJSON (JSONStream* js,
1734+ TimelineEventFilter* filter) {
17261735 JSONObject topLevel (js);
17271736 topLevel.AddProperty (" type" , " Timeline" );
17281737 {
@@ -1734,30 +1743,26 @@ void TimelineEventFixedBufferRecorder::PrintJSON(JSONStream* js,
17341743 topLevel.AddPropertyTimeMicros (" timeExtentMicros" , TimeExtentMicros ());
17351744}
17361745
1737- #define PRINT_PERFETTO_TIMELINE_BODY \
1738- JSONObject jsobj_topLevel (js); \
1739- jsobj_topLevel.AddProperty(" type" , " PerfettoTimeline" ); \
1740- \
1741- js->AppendSerializedObject (" \" trace\" :" ); \
1742- { \
1743- JSONBase64String jsonBase64String (js); \
1744- PrintPerfettoMeta (&jsonBase64String); \
1745- PrintPerfettoEvents (&jsonBase64String, filter); \
1746- } \
1747- \
1748- jsobj_topLevel.AddPropertyTimeMicros(" timeOriginMicros" , \
1749- TimeOriginMicros ()); \
1750- jsobj_topLevel.AddPropertyTimeMicros(" timeExtentMicros" , TimeExtentMicros());
1751-
17521746#if defined(SUPPORT_PERFETTO)
1753- void TimelineEventFixedBufferRecorder ::PrintPerfettoTimeline (
1747+ void TimelineEventBufferedRecorder ::PrintPerfettoTimeline (
17541748 JSONStream* js,
17551749 const TimelineEventFilter& filter) {
1756- PRINT_PERFETTO_TIMELINE_BODY
1750+ JSONObject jsobj_topLevel (js);
1751+ jsobj_topLevel.AddProperty (" type" , " PerfettoTimeline" );
1752+
1753+ js->AppendSerializedObject (" \" trace\" :" );
1754+ {
1755+ JSONBase64String jsonBase64String (js);
1756+ PrintPerfettoMeta (&jsonBase64String);
1757+ PrintPerfettoEvents (&jsonBase64String, filter);
1758+ }
1759+
1760+ jsobj_topLevel.AddPropertyTimeMicros (" timeOriginMicros" , TimeOriginMicros ());
1761+ jsobj_topLevel.AddPropertyTimeMicros (" timeExtentMicros" , TimeExtentMicros ());
17571762}
17581763#endif // defined(SUPPORT_PERFETTO)
17591764
1760- void TimelineEventFixedBufferRecorder ::PrintTraceEvent (
1765+ void TimelineEventBufferedRecorder ::PrintTraceEvent (
17611766 JSONStream* js,
17621767 TimelineEventFilter* filter) {
17631768 JSONArray events (js);
@@ -2225,9 +2230,8 @@ TimelineEventEndlessRecorder::~TimelineEventEndlessRecorder() {
22252230}
22262231
22272232#ifndef PRODUCT
2228- void TimelineEventEndlessRecorder::PrintEventsCommon (
2229- const TimelineEventFilter& filter,
2230- std::function<void (const TimelineEvent&)>&& print_impl) {
2233+ void TimelineEventEndlessRecorder::ForEachNonEmptyBlock (
2234+ std::function<void (const TimelineEventBlock&)>&& handle_block) {
22312235 // Acquire the recorder's lock to prevent the reclaimed blocks from being
22322236 // handed out again until the trace has been serialized.
22332237 MutexLocker ml (&lock_);
@@ -2238,74 +2242,9 @@ void TimelineEventEndlessRecorder::PrintEventsCommon(
22382242 if (!current->ContainsEventsThatCanBeSerializedLocked ()) {
22392243 continue ;
22402244 }
2241- intptr_t length = current->length ();
2242- for (intptr_t i = 0 ; i < length; i++) {
2243- TimelineEvent* event = current->At (i);
2244- if (filter.IncludeEvent (event) &&
2245- event->Within (filter.time_origin_micros (),
2246- filter.time_extent_micros ())) {
2247- ReportTime (event->LowTime ());
2248- ReportTime (event->HighTime ());
2249- print_impl (*event);
2250- }
2251- }
2245+ handle_block (*current);
22522246 }
22532247}
2254-
2255- void TimelineEventEndlessRecorder::PrintJSONEvents (
2256- const JSONArray& events,
2257- const TimelineEventFilter& filter) {
2258- PrintEventsCommon (filter, [&events](const TimelineEvent& event) {
2259- events.AddValue (&event);
2260- });
2261- }
2262-
2263- #if defined(SUPPORT_PERFETTO)
2264- void TimelineEventEndlessRecorder::PrintPerfettoEvents (
2265- JSONBase64String* jsonBase64String,
2266- const TimelineEventFilter& filter) {
2267- PrintEventsCommon (
2268- filter, [this , &jsonBase64String](const TimelineEvent& event) {
2269- PrintPerfettoEventCallbackBody (
2270- &packet (), event,
2271- [&jsonBase64String](
2272- protozero::HeapBuffered<perfetto::protos::pbzero::TracePacket>*
2273- packet) {
2274- perfetto_utils::AppendPacketToJSONBase64String (jsonBase64String,
2275- packet);
2276- });
2277- });
2278- }
2279- #endif // defined(SUPPORT_PERFETTO)
2280-
2281- void TimelineEventEndlessRecorder::PrintJSON (JSONStream* js,
2282- TimelineEventFilter* filter) {
2283- JSONObject topLevel (js);
2284- topLevel.AddProperty (" type" , " Timeline" );
2285- {
2286- JSONArray events (&topLevel, " traceEvents" );
2287- PrintJSONMeta (events);
2288- PrintJSONEvents (events, *filter);
2289- }
2290- topLevel.AddPropertyTimeMicros (" timeOriginMicros" , TimeOriginMicros ());
2291- topLevel.AddPropertyTimeMicros (" timeExtentMicros" , TimeExtentMicros ());
2292- }
2293-
2294- #if defined(SUPPORT_PERFETTO)
2295- void TimelineEventEndlessRecorder::PrintPerfettoTimeline (
2296- JSONStream* js,
2297- const TimelineEventFilter& filter) {
2298- PRINT_PERFETTO_TIMELINE_BODY
2299- }
2300- #endif // defined(SUPPORT_PERFETTO)
2301-
2302- void TimelineEventEndlessRecorder::PrintTraceEvent (
2303- JSONStream* js,
2304- TimelineEventFilter* filter) {
2305- JSONArray events (js);
2306- PrintJSONMeta (events);
2307- PrintJSONEvents (events, *filter);
2308- }
23092248#endif // !defined(PRODUCT)
23102249
23112250TimelineEventBlock* TimelineEventEndlessRecorder::GetHeadBlockLocked () {
0 commit comments