diff --git a/packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp b/packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp index 3b848f20b31..03cb4dd6371 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp +++ b/packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp @@ -111,6 +111,36 @@ void PerformanceTracer::collectEvents( } } +folly::dynamic PerformanceTracer::collectEvents(uint16_t chunkSize) { + std::vector localBuffer; + { + std::lock_guard lock(mutex_); + buffer_.swap(localBuffer); + } + + auto chunks = folly::dynamic::array(); + if (localBuffer.empty()) { + return chunks; + } + + auto chunk = folly::dynamic::array(); + chunk.reserve(chunkSize); + for (auto&& event : localBuffer) { + chunk.push_back(serializeTraceEvent(std::move(event))); + + if (chunk.size() == chunkSize) { + chunks.push_back(std::move(chunk)); + chunk = folly::dynamic::array(); + chunk.reserve(chunkSize); + } + } + + if (!chunk.empty()) { + chunks.push_back(std::move(chunk)); + } + return chunks; +} + void PerformanceTracer::reportMark( const std::string_view& name, HighResTimeStamp start, diff --git a/packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.h b/packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.h index 7623b773a25..d2673d7e43a 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.h +++ b/packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.h @@ -60,6 +60,12 @@ class PerformanceTracer { resultCallback, uint16_t chunkSize); + /** + * Flush out buffered CDP Trace Events into a folly::dynamic collection of + * chunks, which can be sent over CDP later. + */ + folly::dynamic collectEvents(uint16_t chunkSize); + /** * Record a `Performance.mark()` event - a labelled timestamp. If not * currently tracing, this is a no-op.