73
logSuspendedRenderPhase,
74
logErroredRenderPhase,
75
logInconsistentRender,
76
+ logSuspendedWithDelayPhase,
77
logSuspenseThrottlePhase,
78
logSuspendedCommitPhase,
79
logCommitPhase,
240
blockingEventTime,
241
blockingEventType,
242
blockingEventIsRepeat,
243
+ blockingSuspendedTime,
244
transitionClampTime,
245
transitionStartTime,
246
transitionUpdateTime,
247
transitionEventTime,
248
transitionEventType,
249
transitionEventIsRepeat,
250
+ transitionSuspendedTime,
251
clearBlockingTimers,
252
clearTransitionTimers,
253
clampBlockingTimers,
263
stopProfilerTimerIfRunningAndRecordDuration,
264
stopProfilerTimerIfRunningAndRecordIncompleteDuration,
265
markUpdateAsRepeat,
266
+ trackSuspendedTime,
267
} from './ReactProfilerTimer';
268
import {setCurrentTrackFromLanes} from './ReactFiberPerformanceTrack';
269
958
}
959
break;
960
} else {
961
+ let renderEndTime = 0;
962
+ if (enableProfilerTimer && enableComponentPerformanceTrack) {
963
+ renderEndTime = now();
964
+ }
965
+
966
// The render completed.
967
968
// Check if this render may have yielded to a concurrent event, and if so,
977
) {
978
if (enableProfilerTimer && enableComponentPerformanceTrack) {
979
setCurrentTrackFromLanes(lanes);
971
- const renderEndTime = now();
980
logInconsistentRender(renderStartTime, renderEndTime);
981
finalizeRender(lanes, renderEndTime);
982
markUpdateAsRepeat(lanes);
1004
if (errorRetryLanes !== NoLanes) {
1005
if (enableProfilerTimer && enableComponentPerformanceTrack) {
1006
setCurrentTrackFromLanes(lanes);
999
- const renderEndTime = now();
1007
logErroredRenderPhase(renderStartTime, renderEndTime);
1008
finalizeRender(lanes, renderEndTime);
1009
markUpdateAsRepeat(lanes);
1027
continue;
1028
} else {
1029
// The root errored yet again. Proceed to commit the tree.
1030
+ if (enableProfilerTimer && enableComponentPerformanceTrack) {
1031
+ renderEndTime = now();
1032
+ }
1033
}
1034
}
1035
}
1036
if (exitStatus === RootFatalErrored) {
1037
if (enableProfilerTimer && enableComponentPerformanceTrack) {
1038
setCurrentTrackFromLanes(lanes);
1029
- const renderEndTime = now();
1039
logErroredRenderPhase(renderStartTime, renderEndTime);
1040
finalizeRender(lanes, renderEndTime);
1041
}
1049
1050
// We now have a consistent tree. The next step is either to commit it,
1051
// or, if something suspended, wait to commit it after a timeout.
1043
- finishConcurrentRender(root, exitStatus, finishedWork, lanes);
1052
+ finishConcurrentRender(
1053
+ root,
1054
+ exitStatus,
1055
+ finishedWork,
1056
+ lanes,
1057
+ renderEndTime,
1058
+ );
1059
}
1060
break;
1061
} while (true);
1154
exitStatus: RootExitStatus,
1155
finishedWork: Fiber,
1156
lanes: Lanes,
1157
+ renderEndTime: number, // Profiling-only
1158
) {
1143
- let renderEndTime = 0;
1144
- if (enableProfilerTimer && enableComponentPerformanceTrack) {
1145
- // Track when we finished the last unit of work, before we actually commit it.
1146
- // The commit can be suspended/blocked until we commit it.
1147
- renderEndTime = now();
1148
- }
1149
-
1159
// TODO: The fact that most of these branches are identical suggests that some
1160
// of the exit statuses are not best modeled as exit statuses and should be
1161
// tracked orthogonally.
1179
setCurrentTrackFromLanes(lanes);
1180
logSuspendedRenderPhase(renderStartTime, renderEndTime);
1181
finalizeRender(lanes, renderEndTime);
1182
+ trackSuspendedTime(lanes, renderEndTime);
1183
}
1184
const didAttemptEntireTree = !workInProgressRootDidSkipSuspendedSiblings;
1185
markRootSuspended(
1715
}
1716
1717
if (includesSyncLane(lanes) || includesBlockingLane(lanes)) {
1708
- logBlockingStart(
1718
+ const clampedUpdateTime =
1719
blockingUpdateTime >= 0 && blockingUpdateTime < blockingClampTime
1720
? blockingClampTime
1711
- : blockingUpdateTime,
1721
+ : blockingUpdateTime;
1722
+ const clampedEventTime =
1723
blockingEventTime >= 0 && blockingEventTime < blockingClampTime
1724
? blockingClampTime
1714
- : blockingEventTime,
1725
+ : blockingEventTime;
1726
+ if (blockingSuspendedTime >= 0) {
1727
+ setCurrentTrackFromLanes(lanes);
1728
+ logSuspendedWithDelayPhase(
1729
+ blockingSuspendedTime,
1730
+ // Clamp the suspended time to the first event/update.
1731
+ clampedEventTime >= 0
1732
+ ? clampedEventTime
1733
+ : clampedUpdateTime >= 0
1734
+ ? clampedUpdateTime
1735
+ : renderStartTime,
1736
+ );
1737
+ }
1738
+ logBlockingStart(
1739
+ clampedUpdateTime,
1740
+ clampedEventTime,
1741
blockingEventType,
1742
blockingEventIsRepeat,
1743
renderStartTime,
1745
clearBlockingTimers();
1746
}
1747
if (includesTransitionLane(lanes)) {
1722
- logTransitionStart(
1748
+ const clampedStartTime =
1749
transitionStartTime >= 0 && transitionStartTime < transitionClampTime
1750
? transitionClampTime
1725
- : transitionStartTime,
1751
+ : transitionStartTime;
1752
+ const clampedUpdateTime =
1753
transitionUpdateTime >= 0 && transitionUpdateTime < transitionClampTime
1754
? transitionClampTime
1728
- : transitionUpdateTime,
1755
+ : transitionUpdateTime;
1756
+ const clampedEventTime =
1757
transitionEventTime >= 0 && transitionEventTime < transitionClampTime
1758
? transitionClampTime
1731
- : transitionEventTime,
1759
+ : transitionEventTime;
1760
+ if (transitionSuspendedTime >= 0) {
1761
+ setCurrentTrackFromLanes(lanes);
1762
+ logSuspendedWithDelayPhase(
1763
+ transitionSuspendedTime,
1764
+ // Clamp the suspended time to the first event/update.
1765
+ clampedEventTime >= 0
1766
+ ? clampedEventTime
1767
+ : clampedUpdateTime >= 0
1768
+ ? clampedUpdateTime
1769
+ : renderStartTime,
1770
+ );
1771
+ }
1772
+ logTransitionStart(
1773
+ clampedStartTime,
1774
+ clampedUpdateTime,
1775
+ clampedEventTime,
1776
transitionEventType,
1777
transitionEventIsRepeat,
1778
renderStartTime,