Skip to content

Commit 350196b

Browse files
committed
Remove distinction between long, short transitions
We're removing the `timeoutMs` option, so there's no longer any distinction between "short" and "long" transitions. They're all treated the same. This commit doesn't remove `timeoutMs` yet, only combines the internal priority levels.
1 parent 60ba723 commit 350196b

File tree

5 files changed

+42
-123
lines changed

5 files changed

+42
-123
lines changed

packages/react-reconciler/src/ReactFiberLane.js

Lines changed: 40 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -43,23 +43,20 @@ import {
4343
NoPriority as NoSchedulerPriority,
4444
} from './SchedulerWithReactIntegration.new';
4545

46-
export const SyncLanePriority: LanePriority = 17;
47-
export const SyncBatchedLanePriority: LanePriority = 16;
46+
export const SyncLanePriority: LanePriority = 15;
47+
export const SyncBatchedLanePriority: LanePriority = 14;
4848

49-
const InputDiscreteHydrationLanePriority: LanePriority = 15;
50-
export const InputDiscreteLanePriority: LanePriority = 14;
49+
const InputDiscreteHydrationLanePriority: LanePriority = 13;
50+
export const InputDiscreteLanePriority: LanePriority = 12;
5151

52-
const InputContinuousHydrationLanePriority: LanePriority = 13;
53-
export const InputContinuousLanePriority: LanePriority = 12;
52+
const InputContinuousHydrationLanePriority: LanePriority = 11;
53+
export const InputContinuousLanePriority: LanePriority = 10;
5454

55-
const DefaultHydrationLanePriority: LanePriority = 11;
56-
export const DefaultLanePriority: LanePriority = 10;
55+
const DefaultHydrationLanePriority: LanePriority = 9;
56+
export const DefaultLanePriority: LanePriority = 8;
5757

58-
const TransitionShortHydrationLanePriority: LanePriority = 9;
59-
export const TransitionShortLanePriority: LanePriority = 8;
60-
61-
const TransitionLongHydrationLanePriority: LanePriority = 7;
62-
export const TransitionLongLanePriority: LanePriority = 6;
58+
const TransitionHydrationPriority: LanePriority = 7;
59+
export const TransitionPriority: LanePriority = 6;
6360

6461
const RetryLanePriority: LanePriority = 5;
6562

@@ -89,11 +86,8 @@ const InputContinuousLanes: Lanes = /* */ 0b0000000000000000000
8986
export const DefaultHydrationLane: Lane = /* */ 0b0000000000000000000000100000000;
9087
export const DefaultLanes: Lanes = /* */ 0b0000000000000000000111000000000;
9188

92-
const TransitionShortHydrationLane: Lane = /* */ 0b0000000000000000001000000000000;
93-
const TransitionShortLanes: Lanes = /* */ 0b0000000000000011110000000000000;
94-
95-
const TransitionLongHydrationLane: Lane = /* */ 0b0000000000000100000000000000000;
96-
const TransitionLongLanes: Lanes = /* */ 0b0000000001111000000000000000000;
89+
const TransitionHydrationLane: Lane = /* */ 0b0000000000000000001000000000000;
90+
const TransitionLanes: Lanes = /* */ 0b0000000001111111110000000000000;
9791

9892
const RetryLanes: Lanes = /* */ 0b0000011110000000000000000000000;
9993

@@ -160,23 +154,14 @@ function getHighestPriorityLanes(lanes: Lanes | Lane): Lanes {
160154
return_highestLanePriority = DefaultLanePriority;
161155
return defaultLanes;
162156
}
163-
if ((lanes & TransitionShortHydrationLane) !== NoLanes) {
164-
return_highestLanePriority = TransitionShortHydrationLanePriority;
165-
return TransitionShortHydrationLane;
166-
}
167-
const transitionShortLanes = TransitionShortLanes & lanes;
168-
if (transitionShortLanes !== NoLanes) {
169-
return_highestLanePriority = TransitionShortLanePriority;
170-
return transitionShortLanes;
157+
if ((lanes & TransitionHydrationLane) !== NoLanes) {
158+
return_highestLanePriority = TransitionHydrationPriority;
159+
return TransitionHydrationLane;
171160
}
172-
if ((lanes & TransitionLongHydrationLane) !== NoLanes) {
173-
return_highestLanePriority = TransitionLongHydrationLanePriority;
174-
return TransitionLongHydrationLane;
175-
}
176-
const transitionLongLanes = TransitionLongLanes & lanes;
177-
if (transitionLongLanes !== NoLanes) {
178-
return_highestLanePriority = TransitionLongLanePriority;
179-
return transitionLongLanes;
161+
const transitionLanes = TransitionLanes & lanes;
162+
if (transitionLanes !== NoLanes) {
163+
return_highestLanePriority = TransitionPriority;
164+
return transitionLanes;
180165
}
181166
const retryLanes = RetryLanes & lanes;
182167
if (retryLanes !== NoLanes) {
@@ -241,10 +226,8 @@ export function lanePriorityToSchedulerPriority(
241226
return UserBlockingSchedulerPriority;
242227
case DefaultHydrationLanePriority:
243228
case DefaultLanePriority:
244-
case TransitionShortHydrationLanePriority:
245-
case TransitionShortLanePriority:
246-
case TransitionLongHydrationLanePriority:
247-
case TransitionLongLanePriority:
229+
case TransitionHydrationPriority:
230+
case TransitionPriority:
248231
case SelectiveHydrationLanePriority:
249232
case RetryLanePriority:
250233
return NormalSchedulerPriority;
@@ -402,7 +385,7 @@ function computeExpirationTime(lane: Lane, currentTime: number) {
402385
if (priority >= InputContinuousLanePriority) {
403386
// User interactions should expire slightly more quickly.
404387
return currentTime + 1000;
405-
} else if (priority >= TransitionLongLanePriority) {
388+
} else if (priority >= TransitionPriority) {
406389
return currentTime + 5000;
407390
} else {
408391
// Anything idle priority or lower should never expire.
@@ -513,9 +496,7 @@ export function findUpdateLane(
513496
if (lane === NoLane) {
514497
// If all the default lanes are already being worked on, look for a
515498
// lane in the transition range.
516-
lane = pickArbitraryLane(
517-
(TransitionShortLanes | TransitionLongLanes) & ~wipLanes,
518-
);
499+
lane = pickArbitraryLane(TransitionLanes & ~wipLanes);
519500
if (lane === NoLane) {
520501
// All the transition lanes are taken, too. This should be very
521502
// rare, but as a last resort, pick a default lane. This will have
@@ -525,8 +506,7 @@ export function findUpdateLane(
525506
}
526507
return lane;
527508
}
528-
case TransitionShortLanePriority: // Should be handled by findTransitionLane instead
529-
case TransitionLongLanePriority:
509+
case TransitionPriority: // Should be handled by findTransitionLane instead
530510
case RetryLanePriority: // Should be handled by findRetryLane instead
531511
break;
532512
case IdleLanePriority:
@@ -548,48 +528,21 @@ export function findUpdateLane(
548528

549529
// To ensure consistency across multiple updates in the same event, this should
550530
// be pure function, so that it always returns the same lane for given inputs.
551-
export function findTransitionLane(
552-
lanePriority: LanePriority,
553-
wipLanes: Lanes,
554-
pendingLanes: Lanes,
555-
): Lane {
556-
if (lanePriority === TransitionShortLanePriority) {
557-
// First look for lanes that are completely unclaimed, i.e. have no
558-
// pending work.
559-
let lane = pickArbitraryLane(TransitionShortLanes & ~pendingLanes);
560-
if (lane === NoLane) {
561-
// If all lanes have pending work, look for a lane that isn't currently
562-
// being worked on.
563-
lane = pickArbitraryLane(TransitionShortLanes & ~wipLanes);
564-
if (lane === NoLane) {
565-
// If everything is being worked on, pick any lane. This has the
566-
// effect of interrupting the current work-in-progress.
567-
lane = pickArbitraryLane(TransitionShortLanes);
568-
}
569-
}
570-
return lane;
571-
}
572-
if (lanePriority === TransitionLongLanePriority) {
573-
// First look for lanes that are completely unclaimed, i.e. have no
574-
// pending work.
575-
let lane = pickArbitraryLane(TransitionLongLanes & ~pendingLanes);
531+
export function findTransitionLane(wipLanes: Lanes, pendingLanes: Lanes): Lane {
532+
// First look for lanes that are completely unclaimed, i.e. have no
533+
// pending work.
534+
let lane = pickArbitraryLane(TransitionLanes & ~pendingLanes);
535+
if (lane === NoLane) {
536+
// If all lanes have pending work, look for a lane that isn't currently
537+
// being worked on.
538+
lane = pickArbitraryLane(TransitionLanes & ~wipLanes);
576539
if (lane === NoLane) {
577-
// If all lanes have pending work, look for a lane that isn't currently
578-
// being worked on.
579-
lane = pickArbitraryLane(TransitionLongLanes & ~wipLanes);
580-
if (lane === NoLane) {
581-
// If everything is being worked on, pick any lane. This has the
582-
// effect of interrupting the current work-in-progress.
583-
lane = pickArbitraryLane(TransitionLongLanes);
584-
}
540+
// If everything is being worked on, pick any lane. This has the
541+
// effect of interrupting the current work-in-progress.
542+
lane = pickArbitraryLane(TransitionLanes);
585543
}
586-
return lane;
587544
}
588-
invariant(
589-
false,
590-
'Invalid transition priority: %s. This is a bug in React.',
591-
lanePriority,
592-
);
545+
return lane;
593546
}
594547

595548
// To ensure consistency across multiple updates in the same event, this should
@@ -816,18 +769,14 @@ export function getBumpedLaneForHydration(
816769
case DefaultLanePriority:
817770
lane = DefaultHydrationLane;
818771
break;
819-
case TransitionShortHydrationLanePriority:
820-
case TransitionShortLanePriority:
821-
lane = TransitionShortHydrationLane;
822-
break;
823-
case TransitionLongHydrationLanePriority:
824-
case TransitionLongLanePriority:
825-
lane = TransitionLongHydrationLane;
772+
case TransitionHydrationPriority:
773+
case TransitionPriority:
774+
lane = TransitionHydrationLane;
826775
break;
827776
case RetryLanePriority:
828777
// Shouldn't be reachable under normal circumstances, so there's no
829778
// dedicated lane for retry priority. Use the one for long transitions.
830-
lane = TransitionLongHydrationLane;
779+
lane = TransitionHydrationLane;
831780
break;
832781
case SelectiveHydrationLanePriority:
833782
lane = SelectiveHydrationLane;

packages/react-reconciler/src/ReactFiberWorkLoop.new.js

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,6 @@ import {
153153
SyncLanePriority,
154154
SyncBatchedLanePriority,
155155
InputDiscreteLanePriority,
156-
TransitionShortLanePriority,
157-
TransitionLongLanePriority,
158156
DefaultLanePriority,
159157
NoLanes,
160158
NoLane,
@@ -457,24 +455,13 @@ export function requestUpdateLane(
457455
// Use the size of the timeout as a heuristic to prioritize shorter
458456
// transitions over longer ones.
459457
// TODO: This will coerce numbers larger than 31 bits to 0.
460-
const timeoutMs = suspenseConfig.timeoutMs;
461-
const transitionLanePriority =
462-
timeoutMs === undefined || (timeoutMs | 0) < 10000
463-
? TransitionShortLanePriority
464-
: TransitionLongLanePriority;
465-
466458
if (currentEventPendingLanes !== NoLanes) {
467459
currentEventPendingLanes =
468460
mostRecentlyUpdatedRoot !== null
469461
? mostRecentlyUpdatedRoot.pendingLanes
470462
: NoLanes;
471463
}
472-
473-
return findTransitionLane(
474-
transitionLanePriority,
475-
currentEventWipLanes,
476-
currentEventPendingLanes,
477-
);
464+
return findTransitionLane(currentEventWipLanes, currentEventPendingLanes);
478465
}
479466

480467
// TODO: Remove this dependency on the Scheduler priority.

packages/react-reconciler/src/ReactFiberWorkLoop.old.js

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,6 @@ import {
139139
SyncLanePriority,
140140
SyncBatchedLanePriority,
141141
InputDiscreteLanePriority,
142-
TransitionShortLanePriority,
143-
TransitionLongLanePriority,
144142
DefaultLanePriority,
145143
NoLanes,
146144
NoLane,
@@ -445,24 +443,13 @@ export function requestUpdateLane(
445443
// Use the size of the timeout as a heuristic to prioritize shorter
446444
// transitions over longer ones.
447445
// TODO: This will coerce numbers larger than 31 bits to 0.
448-
const timeoutMs = suspenseConfig.timeoutMs;
449-
const transitionLanePriority =
450-
timeoutMs === undefined || (timeoutMs | 0) < 10000
451-
? TransitionShortLanePriority
452-
: TransitionLongLanePriority;
453-
454446
if (currentEventPendingLanes !== NoLanes) {
455447
currentEventPendingLanes =
456448
mostRecentlyUpdatedRoot !== null
457449
? mostRecentlyUpdatedRoot.pendingLanes
458450
: NoLanes;
459451
}
460-
461-
return findTransitionLane(
462-
transitionLanePriority,
463-
currentEventWipLanes,
464-
currentEventPendingLanes,
465-
);
452+
return findTransitionLane(currentEventWipLanes, currentEventPendingLanes);
466453
}
467454

468455
// TODO: Remove this dependency on the Scheduler priority.

packages/react-reconciler/src/__tests__/ReactSuspenseWithNoopRenderer-test.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4030,9 +4030,6 @@ describe('ReactSuspenseWithNoopRenderer', () => {
40304030
// Neither is resolved yet.
40314031
'Pending...',
40324032
'',
4033-
'Pending...',
4034-
'Suspend! [a]',
4035-
'Loading...',
40364033
'Suspend! [b]',
40374034
'Loading...',
40384035
]);

scripts/error-codes/codes.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,6 @@
348348
"356": "Could not read the cache.",
349349
"357": "The current renderer does not support React Scopes. This error is likely caused by a bug in React. Please file an issue.",
350350
"358": "Invalid update priority: %s. This is a bug in React.",
351-
"359": "Invalid transition priority: %s. This is a bug in React.",
352351
"360": "Invalid lane: %s. This is a bug in React.",
353352
"361": "The current renderer does not support test selectors. This error is likely caused by a bug in React. Please file an issue.",
354353
"362": "Could not find React container within specified host subtree.",

0 commit comments

Comments
 (0)