Skip to content

Commit 5b7d92f

Browse files
hoxyqmeta-codesync[bot]
authored andcommitted
Define FrameTimingSequence (facebook#54674)
Summary: Pull Request resolved: facebook#54674 # Changelog: [Internal] This diff introduces a definition for `FrameTimingSequence`, which will represent the different phases of a frame that will be reported as part of the trace. These sequences will be stored on a `HostTargetTraceRecording`. It is `Host`'s responsibility to propagate these entities to `HostTarget`, there will be a corresponding method for this. Reviewed By: sbuggay Differential Revision: D87373811 fbshipit-source-id: bd894f8c39a6d4ee0bef1303e4f801b27fabc901
1 parent e651563 commit 5b7d92f

File tree

4 files changed

+88
-1
lines changed

4 files changed

+88
-1
lines changed

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

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,15 @@ HostTargetTraceRecording::HostTargetTraceRecording(
2020
: hostTarget_(hostTarget),
2121
tracingMode_(tracingMode),
2222
enabledCategories_(std::move(enabledCategories)),
23-
windowSize_(windowSize) {}
23+
windowSize_(windowSize) {
24+
if (windowSize) {
25+
frameTimings_ = tracing::TimeWindowedBuffer<tracing::FrameTimingSequence>(
26+
[](auto& sequence) { return sequence.beginDrawingTimestamp; },
27+
*windowSize);
28+
} else {
29+
frameTimings_ = tracing::TimeWindowedBuffer<tracing::FrameTimingSequence>();
30+
};
31+
}
2432

2533
void HostTargetTraceRecording::setTracedInstance(
2634
InstanceTarget* instanceTarget) {
@@ -60,9 +68,19 @@ tracing::HostTracingProfile HostTargetTraceRecording::stop() {
6068
return tracing::HostTracingProfile{
6169
.processId = oscompat::getCurrentProcessId(),
6270
.startTime = startTime,
71+
.frameTimings = frameTimings_.pruneExpiredAndExtract(),
6372
.instanceTracingProfiles = std::move(state.instanceTracingProfiles),
6473
.runtimeSamplingProfiles = std::move(state.runtimeSamplingProfiles),
6574
};
6675
}
6776

77+
void HostTargetTraceRecording::recordFrameTimings(
78+
tracing::FrameTimingSequence frameTimingSequence) {
79+
assert(
80+
state_.has_value() &&
81+
"The state for this tracing session has not been initialized.");
82+
83+
frameTimings_.push(frameTimingSequence);
84+
}
85+
6886
} // namespace facebook::react::jsinspector_modern

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
#include "HostTarget.h"
1212
#include "InstanceTarget.h"
1313

14+
#include <jsinspector-modern/tracing/FrameTimingSequence.h>
1415
#include <jsinspector-modern/tracing/HostTracingProfile.h>
16+
#include <jsinspector-modern/tracing/TimeWindowedBuffer.h>
1517
#include <jsinspector-modern/tracing/TraceRecordingState.h>
1618
#include <jsinspector-modern/tracing/TracingCategory.h>
1719
#include <react/timing/primitives.h>
@@ -67,6 +69,13 @@ class HostTargetTraceRecording {
6769
*/
6870
tracing::HostTracingProfile stop();
6971

72+
/**
73+
* Adds the frame timing sequence to the current state of this trace recording.
74+
*
75+
* The caller guarantees the protection from data races. This is protected by the tracing mutex in HostTarget.
76+
*/
77+
void recordFrameTimings(tracing::FrameTimingSequence frameTimingSequence);
78+
7079
private:
7180
/**
7281
* The Host for which this Trace Recording is going to happen.
@@ -104,6 +113,11 @@ class HostTargetTraceRecording {
104113
* The size of the time window for this recording.
105114
*/
106115
std::optional<HighResDuration> windowSize_;
116+
117+
/**
118+
* Frame timings captured on the Host side.
119+
*/
120+
tracing::TimeWindowedBuffer<tracing::FrameTimingSequence> frameTimings_;
107121
};
108122

109123
} // namespace facebook::react::jsinspector_modern
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
#pragma once
9+
10+
#include "TraceEvent.h"
11+
12+
#include <react/timing/primitives.h>
13+
14+
namespace facebook::react::jsinspector_modern::tracing {
15+
16+
/**
17+
* A struct representing a sequence of frame timings that happened on the Host side.
18+
*/
19+
struct FrameTimingSequence {
20+
FrameTimingSequence() = delete;
21+
22+
FrameTimingSequence(
23+
uint64_t id,
24+
ThreadId threadId,
25+
HighResTimeStamp beginDrawingTimestamp,
26+
HighResTimeStamp commitTimestamp,
27+
HighResTimeStamp endDrawingTimestamp)
28+
: id(id),
29+
threadId(threadId),
30+
beginDrawingTimestamp(beginDrawingTimestamp),
31+
commitTimestamp(commitTimestamp),
32+
endDrawingTimestamp(endDrawingTimestamp)
33+
{
34+
}
35+
36+
/**
37+
* Unique ID of the sequence, used by Chrome DevTools Frontend to identify the events that form one sequence.
38+
*/
39+
uint64_t id;
40+
41+
/**
42+
* The ID of the native thread that is associated with the frame.
43+
*/
44+
ThreadId threadId;
45+
46+
HighResTimeStamp beginDrawingTimestamp;
47+
HighResTimeStamp commitTimestamp;
48+
HighResTimeStamp endDrawingTimestamp;
49+
};
50+
51+
} // namespace facebook::react::jsinspector_modern::tracing

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#pragma once
99

10+
#include "FrameTimingSequence.h"
1011
#include "InstanceTracingProfile.h"
1112
#include "RuntimeSamplingProfile.h"
1213

@@ -29,6 +30,9 @@ struct HostTracingProfile {
2930
// The timestamp at which this Trace Recording started.
3031
HighResTimeStamp startTime;
3132

33+
// Frame timings captured on the Host side.
34+
std::vector<FrameTimingSequence> frameTimings;
35+
3236
// All captured Instance Tracing Profiles during this Trace Recording.
3337
std::vector<InstanceTracingProfile> instanceTracingProfiles;
3438

0 commit comments

Comments
 (0)