Skip to content

Commit 53d8a98

Browse files
hoxyqmeta-codesync[bot]
authored andcommitted
Serialize stack trace eagerly (#54418)
Summary: Pull Request resolved: #54418 # Changelog: [Internal] Previosuly, we were serializing only at the end of tracing. We were creating a weak pointer to encapsulating `ConsoleTaskContext`. Initially I've decided to do it this way for performance reasons, but this resulted in missing a significant portion of stack traces, if the corresponding task was already gc-ed. Unfortunately, we have to serialize them at the time of reporting to `PerformanceTracer`. Reviewed By: huntie Differential Revision: D86207507 fbshipit-source-id: 58b15145ef081a02f2d79d75e05380968eb43a06
1 parent 7722eae commit 53d8a98

6 files changed

Lines changed: 15 additions & 36 deletions

File tree

packages/react-native/ReactCommon/jsinspector-modern/ConsoleTaskContext.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,6 @@ std::optional<folly::dynamic> ConsoleTaskContext::getSerializedStackTrace()
3939
return maybeValue;
4040
}
4141

42-
std::function<std::optional<folly::dynamic>()>
43-
ConsoleTaskContext::getSerializedStackTraceProvider() const {
44-
return [selfWeak = weak_from_this()]() -> std::optional<folly::dynamic> {
45-
if (auto self = selfWeak.lock()) {
46-
return self->getSerializedStackTrace();
47-
}
48-
49-
return std::nullopt;
50-
};
51-
}
52-
5342
void ConsoleTaskContext::schedule() {
5443
orchestrator_.scheduleTask(id(), weak_from_this());
5544
}

packages/react-native/ReactCommon/jsinspector-modern/ConsoleTaskContext.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,6 @@ class ConsoleTaskContext : public std::enable_shared_from_this<ConsoleTaskContex
8080
*/
8181
std::optional<folly::dynamic> getSerializedStackTrace() const;
8282

83-
/**
84-
* Returns a function that returns the serialized stack trace, if available.
85-
*/
86-
std::function<std::optional<folly::dynamic>()> getSerializedStackTraceProvider() const;
87-
8883
void schedule();
8984

9085
private:

packages/react-native/ReactCommon/jsinspector-modern/RuntimeTargetConsole.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ void consoleTimeStamp(
491491
trackGroup,
492492
color,
493493
std::move(detail),
494-
taskContext ? taskContext->getSerializedStackTraceProvider() : nullptr);
494+
taskContext ? taskContext->getSerializedStackTrace() : nullptr);
495495
}
496496

497497
if (ReactPerfettoLogger::isTracing()) {

packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ void PerformanceTracer::reportMeasure(
188188
HighResTimeStamp start,
189189
HighResDuration duration,
190190
folly::dynamic&& detail,
191-
std::function<std::optional<folly::dynamic>()>&& stackTraceProvider) {
191+
std::optional<folly::dynamic> stackTrace) {
192192
if (!tracingAtomic_) {
193193
return;
194194
}
@@ -205,7 +205,7 @@ void PerformanceTracer::reportMeasure(
205205
.duration = duration,
206206
.detail = std::move(detail),
207207
.threadId = getCurrentThreadId(),
208-
.stackTraceProvider = std::move(stackTraceProvider),
208+
.stackTrace = std::move(stackTrace),
209209
});
210210
}
211211

@@ -217,7 +217,7 @@ void PerformanceTracer::reportTimeStamp(
217217
std::optional<std::string> trackGroup,
218218
std::optional<ConsoleTimeStampColor> color,
219219
std::optional<folly::dynamic> detail,
220-
std::function<std::optional<folly::dynamic>()>&& stackTraceProvider) {
220+
std::optional<folly::dynamic> stackTrace) {
221221
if (!tracingAtomic_) {
222222
return;
223223
}
@@ -236,7 +236,7 @@ void PerformanceTracer::reportTimeStamp(
236236
.trackGroup = std::move(trackGroup),
237237
.color = std::move(color),
238238
.detail = std::move(detail),
239-
.stackTraceProvider = std::move(stackTraceProvider),
239+
.stackTrace = std::move(stackTrace),
240240
.threadId = getCurrentThreadId(),
241241
});
242242
}
@@ -610,11 +610,9 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
610610
beginEventArgs =
611611
folly::dynamic::object("detail", folly::toJson(event.detail));
612612
}
613-
if (event.stackTraceProvider) {
614-
if (auto maybeStackTrace = event.stackTraceProvider()) {
615-
beginEventArgs["data"] = folly::dynamic::object(
616-
"rnStackTrace", std::move(*maybeStackTrace));
617-
}
613+
if (event.stackTrace) {
614+
beginEventArgs["data"] = folly::dynamic::object(
615+
"rnStackTrace", std::move(*event.stackTrace));
618616
}
619617

620618
auto eventId = ++performanceMeasureCount_;
@@ -705,10 +703,8 @@ void PerformanceTracer::enqueueTraceEventsFromPerformanceTracerEvent(
705703
}
706704
data["devtools"] = folly::toJson(devtoolsDetail);
707705
}
708-
if (event.stackTraceProvider) {
709-
if (auto maybeStackTrace = event.stackTraceProvider()) {
710-
data["rnStackTrace"] = std::move(*maybeStackTrace);
711-
}
706+
if (event.stackTrace) {
707+
data["rnStackTrace"] = std::move(*event.stackTrace);
712708
}
713709

714710
events.emplace_back(

packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class PerformanceTracer {
8282
HighResTimeStamp start,
8383
HighResDuration duration,
8484
folly::dynamic &&detail = nullptr,
85-
std::function<std::optional<folly::dynamic>()> &&stackTraceProvider = nullptr);
85+
std::optional<folly::dynamic> stackTrace = nullptr);
8686

8787
/**
8888
* Record a "TimeStamp" Trace Event - a labelled entry on Performance
@@ -99,7 +99,7 @@ class PerformanceTracer {
9999
std::optional<std::string> trackGroup = std::nullopt,
100100
std::optional<ConsoleTimeStampColor> color = std::nullopt,
101101
std::optional<folly::dynamic> detail = std::nullopt,
102-
std::function<std::optional<folly::dynamic>()> &&stackTraceProvider = nullptr);
102+
std::optional<folly::dynamic> stackTrace = std::nullopt);
103103

104104
/**
105105
* Record an Event Loop tick, which will be represented as an Event Loop task
@@ -258,7 +258,7 @@ class PerformanceTracer {
258258
HighResDuration duration;
259259
folly::dynamic detail;
260260
ThreadId threadId;
261-
std::function<std::optional<folly::dynamic>()> stackTraceProvider;
261+
std::optional<folly::dynamic> stackTrace;
262262
HighResTimeStamp createdAt = HighResTimeStamp::now();
263263
};
264264

@@ -270,7 +270,7 @@ class PerformanceTracer {
270270
std::optional<std::string> trackGroup;
271271
std::optional<ConsoleTimeStampColor> color;
272272
std::optional<folly::dynamic> detail;
273-
std::function<std::optional<folly::dynamic>()> stackTraceProvider;
273+
std::optional<folly::dynamic> stackTrace;
274274
ThreadId threadId;
275275
HighResTimeStamp createdAt = HighResTimeStamp::now();
276276
};

packages/react-native/ReactCommon/react/performance/timeline/PerformanceEntryReporter.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -390,8 +390,7 @@ void PerformanceEntryReporter::traceMeasure(
390390
entry.startTime,
391391
entry.duration,
392392
std::move(detail),
393-
taskContext ? taskContext->getSerializedStackTraceProvider()
394-
: nullptr);
393+
taskContext ? taskContext->getSerializedStackTrace() : nullptr);
395394
}
396395
}
397396
}

0 commit comments

Comments
 (0)