@@ -26,7 +26,8 @@ export opaque type LanePriority =
26
26
| 13
27
27
| 14
28
28
| 15
29
- | 16 ;
29
+ | 16
30
+ | 17 ;
30
31
export opaque type Lanes = number ;
31
32
export opaque type Lane = number ;
32
33
export opaque type LaneMap < T > = Array < T > ;
@@ -42,23 +43,25 @@ import {
42
43
NoPriority as NoSchedulerPriority ,
43
44
} from './SchedulerWithReactIntegration.new' ;
44
45
45
- export const SyncLanePriority : LanePriority = 16 ;
46
- const SyncBatchedLanePriority : LanePriority = 15 ;
46
+ export const SyncLanePriority : LanePriority = 17 ;
47
+ const SyncBatchedLanePriority : LanePriority = 16 ;
47
48
48
- const InputDiscreteHydrationLanePriority : LanePriority = 14 ;
49
- export const InputDiscreteLanePriority : LanePriority = 13 ;
49
+ const InputDiscreteHydrationLanePriority : LanePriority = 15 ;
50
+ export const InputDiscreteLanePriority : LanePriority = 14 ;
50
51
51
- const InputContinuousHydrationLanePriority : LanePriority = 12 ;
52
- export const InputContinuousLanePriority : LanePriority = 11 ;
52
+ const InputContinuousHydrationLanePriority : LanePriority = 13 ;
53
+ export const InputContinuousLanePriority : LanePriority = 12 ;
53
54
54
- const DefaultHydrationLanePriority : LanePriority = 10 ;
55
- export const DefaultLanePriority : LanePriority = 9 ;
55
+ const DefaultHydrationLanePriority : LanePriority = 11 ;
56
+ export const DefaultLanePriority : LanePriority = 10 ;
56
57
57
- const TransitionShortHydrationLanePriority : LanePriority = 8 ;
58
- export const TransitionShortLanePriority : LanePriority = 7 ;
58
+ const TransitionShortHydrationLanePriority : LanePriority = 9 ;
59
+ export const TransitionShortLanePriority : LanePriority = 8 ;
59
60
60
- const TransitionLongHydrationLanePriority : LanePriority = 6 ;
61
- export const TransitionLongLanePriority : LanePriority = 5 ;
61
+ const TransitionLongHydrationLanePriority : LanePriority = 7 ;
62
+ export const TransitionLongLanePriority : LanePriority = 6 ;
63
+
64
+ const RetryLanePriority : LanePriority = 5 ;
62
65
63
66
const SelectiveHydrationLanePriority : LanePriority = 4 ;
64
67
@@ -90,25 +93,30 @@ const InputContinuousUpdateRangeStart = 6;
90
93
const InputContinuousUpdateRangeEnd = 8 ;
91
94
92
95
export const DefaultHydrationLane : Lane = /* */ 0b0000000000000000000000100000000 ;
93
- const DefaultLanes : Lanes = /* */ 0b0000000000000000011111100000000 ;
96
+ export const DefaultLanes : Lanes = /* */ 0b0000000000000000000111100000000 ;
94
97
const DefaultUpdateRangeStart = 9 ;
95
- const DefaultUpdateRangeEnd = 14 ;
98
+ const DefaultUpdateRangeEnd = 12 ;
99
+
100
+ const TransitionShortHydrationLane : Lane = /* */ 0b0000000000000000001000000000000 ;
101
+ const TransitionShortLanes : Lanes = /* */ 0b0000000000000011111000000000000 ;
102
+ const TransitionShortUpdateRangeStart = 13 ;
103
+ const TransitionShortUpdateRangeEnd = 17 ;
96
104
97
- const TransitionShortHydrationLane : Lane = /* */ 0b0000000000000000100000000000000 ;
98
- const TransitionShortLanes : Lanes = /* */ 0b0000000000011111100000000000000 ;
99
- const TransitionShortUpdateRangeStart = 15 ;
100
- const TransitionShortUpdateRangeEnd = 20 ;
105
+ const TransitionLongHydrationLane : Lane = /* */ 0b0000000000000100000000000000000 ;
106
+ const TransitionLongLanes : Lanes = /* */ 0b0000000001111100000000000000000 ;
107
+ const TransitionLongUpdateRangeStart = 18 ;
108
+ const TransitionLongUpdateRangeEnd = 22 ;
101
109
102
- const TransitionLongHydrationLane : Lane = /* */ 0b0000000000100000000000000000000 ;
103
- const TransitionLongLanes : Lanes = /* */ 0b0000011111100000000000000000000 ;
104
- const TransitionLongUpdateRangeStart = 21 ;
105
- const TransitionLongUpdateRangeEnd = 26 ;
110
+ // Includes all updates. Except Idle updates, which have special semantics.
111
+ const UpdateRangeEnd = TransitionLongUpdateRangeEnd ;
106
112
107
- export const SelectiveHydrationLane : Lane = /* */ 0b0000110000000000000000000000000 ;
113
+ const RetryLanes : Lanes = /* */ 0b0000011110000000000000000000000 ;
114
+ const RetryRangeStart = 22 ;
115
+ const RetryRangeEnd = 26 ;
116
+
117
+ export const SelectiveHydrationLane : Lane = /* */ 0b0000100000000000000000000000000 ;
108
118
const SelectiveHydrationRangeEnd = 27 ;
109
119
110
- // Includes all non-Idle updates
111
- const UpdateRangeEnd = 27 ;
112
120
const NonIdleLanes = /* */ 0b0000111111111111111111111111111 ;
113
121
114
122
export const IdleHydrationLane : Lane = /* */ 0b0001000000000000000000000000000 ;
@@ -206,6 +214,12 @@ function getHighestPriorityLanes(lanes: Lanes | Lane): Lanes {
206
214
return transitionLongLanes ;
207
215
}
208
216
}
217
+ const retryLanes = RetryLanes & lanes ;
218
+ if ( retryLanes !== NoLanes ) {
219
+ return_highestLanePriority = RetryLanePriority ;
220
+ return_updateRangeEnd = RetryRangeEnd ;
221
+ return retryLanes ;
222
+ }
209
223
if ( lanes & SelectiveHydrationLane ) {
210
224
return_highestLanePriority = SelectiveHydrationLanePriority ;
211
225
return_updateRangeEnd = SelectiveHydrationRangeEnd ;
@@ -275,6 +289,7 @@ export function lanePriorityToSchedulerPriority(
275
289
case TransitionLongHydrationLanePriority :
276
290
case TransitionLongLanePriority :
277
291
case SelectiveHydrationLanePriority :
292
+ case RetryLanePriority :
278
293
return NormalSchedulerPriority ;
279
294
case IdleHydrationLanePriority :
280
295
case IdleLanePriority :
@@ -537,6 +552,9 @@ export function findUpdateLane(
537
552
case TransitionLongLanePriority :
538
553
// Should be handled by findTransitionLane instead
539
554
break ;
555
+ case RetryLanePriority :
556
+ // Should be handled by findRetryLane instead
557
+ break ;
540
558
case IdleLanePriority :
541
559
let lane = findLane ( IdleUpdateRangeStart , IdleUpdateRangeEnd , wipLanes ) ;
542
560
if ( lane === NoLane ) {
@@ -604,6 +622,19 @@ export function findTransitionLane(
604
622
) ;
605
623
}
606
624
625
+ // To ensure consistency across multiple updates in the same event, this should
626
+ // be pure function, so that it always returns the same lane for given inputs.
627
+ export function findRetryLane ( wipLanes : Lanes ) : Lane {
628
+ // This is a fork of `findUpdateLane` designed specifically for Suspense
629
+ // "retries" — a special update that attempts to flip a Suspense boundary
630
+ // from its placeholder state to its primary/resolved state.
631
+ let lane = findLane ( RetryRangeStart , RetryRangeEnd , wipLanes ) ;
632
+ if ( lane === NoLane ) {
633
+ lane = pickArbitraryLane ( RetryLanes ) ;
634
+ }
635
+ return lane ;
636
+ }
637
+
607
638
function findLane ( start , end , skipLanes ) {
608
639
// This finds the first bit between the `start` and `end` positions that isn't
609
640
// in `skipLanes`.
@@ -808,6 +839,11 @@ export function getBumpedLaneForHydration(
808
839
case TransitionLongLanePriority :
809
840
lane = TransitionLongHydrationLane ;
810
841
break ;
842
+ case RetryLanePriority :
843
+ // Shouldn't be reachable under normal circumstances, so there's no
844
+ // dedicated lane for retry priority. Use the one for long transitions.
845
+ lane = TransitionLongHydrationLane ;
846
+ break ;
811
847
case SelectiveHydrationLanePriority :
812
848
lane = SelectiveHydrationLane ;
813
849
break ;
0 commit comments