@@ -69,6 +69,10 @@ import {
69
69
logBlockingStart ,
70
70
logTransitionStart ,
71
71
logRenderPhase ,
72
+ logInterruptedRenderPhase ,
73
+ logSuspendedRenderPhase ,
74
+ logErroredRenderPhase ,
75
+ logInconsistentRender ,
72
76
logSuspenseThrottlePhase ,
73
77
logSuspendedCommitPhase ,
74
78
logCommitPhase ,
@@ -255,6 +259,7 @@ import {
255
259
startProfilerTimer ,
256
260
stopProfilerTimerIfRunningAndRecordDuration ,
257
261
stopProfilerTimerIfRunningAndRecordIncompleteDuration ,
262
+ markUpdateAsRepeat ,
258
263
} from './ReactProfilerTimer' ;
259
264
import { setCurrentTrackFromLanes } from './ReactFiberPerformanceTrack' ;
260
265
@@ -955,6 +960,13 @@ export function performWorkOnRoot(
955
960
renderWasConcurrent &&
956
961
! isRenderConsistentWithExternalStores ( finishedWork )
957
962
) {
963
+ if ( enableProfilerTimer && enableComponentPerformanceTrack ) {
964
+ setCurrentTrackFromLanes ( lanes ) ;
965
+ const renderEndTime = now ( ) ;
966
+ logInconsistentRender ( renderStartTime , renderEndTime ) ;
967
+ finalizeRender ( lanes , renderEndTime ) ;
968
+ markUpdateAsRepeat ( lanes ) ;
969
+ }
958
970
// A store was mutated in an interleaved event. Render again,
959
971
// synchronously, to block further mutations.
960
972
exitStatus = renderRootSync ( root , lanes , false ) ;
@@ -976,6 +988,13 @@ export function performWorkOnRoot(
976
988
lanesThatJustErrored ,
977
989
) ;
978
990
if ( errorRetryLanes !== NoLanes ) {
991
+ if ( enableProfilerTimer && enableComponentPerformanceTrack ) {
992
+ setCurrentTrackFromLanes ( lanes ) ;
993
+ const renderEndTime = now ( ) ;
994
+ logErroredRenderPhase ( renderStartTime , renderEndTime ) ;
995
+ finalizeRender ( lanes , renderEndTime ) ;
996
+ markUpdateAsRepeat ( lanes ) ;
997
+ }
979
998
lanes = errorRetryLanes ;
980
999
exitStatus = recoverFromConcurrentError (
981
1000
root ,
@@ -999,6 +1018,12 @@ export function performWorkOnRoot(
999
1018
}
1000
1019
}
1001
1020
if ( exitStatus === RootFatalErrored ) {
1021
+ if ( enableProfilerTimer && enableComponentPerformanceTrack ) {
1022
+ setCurrentTrackFromLanes ( lanes ) ;
1023
+ const renderEndTime = now ( ) ;
1024
+ logErroredRenderPhase ( renderStartTime , renderEndTime ) ;
1025
+ finalizeRender ( lanes , renderEndTime ) ;
1026
+ }
1002
1027
prepareFreshStack ( root , NoLanes ) ;
1003
1028
// Since this is a fatal error, we're going to pretend we attempted
1004
1029
// the entire tree, to avoid scheduling a prerender.
@@ -1136,6 +1161,8 @@ function finishConcurrentRender(
1136
1161
// placeholder and without scheduling a timeout. Delay indefinitely
1137
1162
// until we receive more data.
1138
1163
if ( enableProfilerTimer && enableComponentPerformanceTrack ) {
1164
+ setCurrentTrackFromLanes ( lanes ) ;
1165
+ logSuspendedRenderPhase ( renderStartTime , renderEndTime ) ;
1139
1166
finalizeRender ( lanes , renderEndTime ) ;
1140
1167
}
1141
1168
const didAttemptEntireTree = ! workInProgressRootDidSkipSuspendedSiblings ;
@@ -1180,6 +1207,7 @@ function finishConcurrentRender(
1180
1207
workInProgressDeferredLane ,
1181
1208
workInProgressRootInterleavedUpdatedLanes ,
1182
1209
workInProgressSuspendedRetryLanes ,
1210
+ exitStatus ,
1183
1211
IMMEDIATE_COMMIT ,
1184
1212
renderStartTime ,
1185
1213
renderEndTime ,
@@ -1230,6 +1258,7 @@ function finishConcurrentRender(
1230
1258
workInProgressRootInterleavedUpdatedLanes ,
1231
1259
workInProgressSuspendedRetryLanes ,
1232
1260
workInProgressRootDidSkipSuspendedSiblings ,
1261
+ exitStatus ,
1233
1262
THROTTLED_COMMIT ,
1234
1263
renderStartTime ,
1235
1264
renderEndTime ,
@@ -1250,6 +1279,7 @@ function finishConcurrentRender(
1250
1279
workInProgressRootInterleavedUpdatedLanes ,
1251
1280
workInProgressSuspendedRetryLanes ,
1252
1281
workInProgressRootDidSkipSuspendedSiblings ,
1282
+ exitStatus ,
1253
1283
IMMEDIATE_COMMIT ,
1254
1284
renderStartTime ,
1255
1285
renderEndTime ,
@@ -1268,6 +1298,7 @@ function commitRootWhenReady(
1268
1298
updatedLanes : Lanes ,
1269
1299
suspendedRetryLanes : Lanes ,
1270
1300
didSkipSuspendedSiblings : boolean ,
1301
+ exitStatus : RootExitStatus ,
1271
1302
suspendedCommitReason : SuspendedCommitReason , // Profiling-only
1272
1303
completedRenderStartTime : number , // Profiling-only
1273
1304
completedRenderEndTime : number , // Profiling-only
@@ -1311,6 +1342,7 @@ function commitRootWhenReady(
1311
1342
spawnedLane ,
1312
1343
updatedLanes ,
1313
1344
suspendedRetryLanes ,
1345
+ exitStatus ,
1314
1346
SUSPENDED_COMMIT ,
1315
1347
completedRenderStartTime ,
1316
1348
completedRenderEndTime ,
@@ -1331,6 +1363,7 @@ function commitRootWhenReady(
1331
1363
spawnedLane ,
1332
1364
updatedLanes ,
1333
1365
suspendedRetryLanes ,
1366
+ exitStatus ,
1334
1367
suspendedCommitReason ,
1335
1368
completedRenderStartTime ,
1336
1369
completedRenderEndTime ,
@@ -1649,13 +1682,21 @@ function finalizeRender(lanes: Lanes, finalizationTime: number): void {
1649
1682
1650
1683
function prepareFreshStack ( root : FiberRoot , lanes : Lanes ) : Fiber {
1651
1684
if ( enableProfilerTimer && enableComponentPerformanceTrack ) {
1685
+ const previousRenderStartTime = renderStartTime ;
1652
1686
// Starting a new render. Log the end of any previous renders and the
1653
1687
// blocked time before the render started.
1654
1688
recordRenderTime ( ) ;
1655
1689
// If this was a restart, e.g. due to an interrupting update, then there's no space
1656
1690
// in the track to log the cause since we'll have rendered all the way up until the
1657
1691
// restart so we need to clamp that.
1658
- finalizeRender ( workInProgressRootRenderLanes , renderStartTime ) ;
1692
+ if (
1693
+ workInProgressRootRenderLanes !== NoLanes &&
1694
+ previousRenderStartTime > 0
1695
+ ) {
1696
+ setCurrentTrackFromLanes ( workInProgressRootRenderLanes ) ;
1697
+ logInterruptedRenderPhase ( previousRenderStartTime , renderStartTime ) ;
1698
+ finalizeRender ( workInProgressRootRenderLanes , renderStartTime ) ;
1699
+ }
1659
1700
1660
1701
if ( includesSyncLane ( lanes ) || includesBlockingLane ( lanes ) ) {
1661
1702
logBlockingStart (
@@ -2983,6 +3024,7 @@ function commitRoot(
2983
3024
spawnedLane : Lane ,
2984
3025
updatedLanes : Lanes ,
2985
3026
suspendedRetryLanes : Lanes ,
3027
+ exitStatus : RootExitStatus ,
2986
3028
suspendedCommitReason : SuspendedCommitReason , // Profiling-only
2987
3029
completedRenderStartTime : number , // Profiling-only
2988
3030
completedRenderEndTime : number , // Profiling-only
@@ -3003,6 +3045,7 @@ function commitRoot(
3003
3045
spawnedLane ,
3004
3046
updatedLanes ,
3005
3047
suspendedRetryLanes ,
3048
+ exitStatus ,
3006
3049
suspendedCommitReason ,
3007
3050
completedRenderStartTime ,
3008
3051
completedRenderEndTime ,
@@ -3022,6 +3065,7 @@ function commitRootImpl(
3022
3065
spawnedLane : Lane ,
3023
3066
updatedLanes : Lanes ,
3024
3067
suspendedRetryLanes : Lanes ,
3068
+ exitStatus : RootExitStatus , // Profiling-only
3025
3069
suspendedCommitReason : SuspendedCommitReason , // Profiling-only
3026
3070
completedRenderStartTime : number , // Profiling-only
3027
3071
completedRenderEndTime : number , // Profiling-only
@@ -3047,7 +3091,11 @@ function commitRootImpl(
3047
3091
if ( enableProfilerTimer && enableComponentPerformanceTrack ) {
3048
3092
// Log the previous render phase once we commit. I.e. we weren't interrupted.
3049
3093
setCurrentTrackFromLanes ( lanes ) ;
3050
- logRenderPhase ( completedRenderStartTime , completedRenderEndTime ) ;
3094
+ if ( exitStatus === RootErrored ) {
3095
+ logErroredRenderPhase ( completedRenderStartTime , completedRenderEndTime ) ;
3096
+ } else {
3097
+ logRenderPhase ( completedRenderStartTime , completedRenderEndTime ) ;
3098
+ }
3051
3099
}
3052
3100
3053
3101
if ( __DEV__ ) {
@@ -3409,7 +3457,7 @@ function commitRootImpl(
3409
3457
3410
3458
if ( enableProfilerTimer && enableComponentPerformanceTrack ) {
3411
3459
if ( ! rootDidHavePassiveEffects ) {
3412
- finalizeRender ( lanes , now ( ) ) ;
3460
+ finalizeRender ( lanes , commitEndTime ) ;
3413
3461
}
3414
3462
}
3415
3463
0 commit comments