Skip to content

Commit ffc8919

Browse files
committed
Use Lane to track root callback priority (facebook#21089)
Instead of LanePriority. I'm removing all uses of LanePriority so I can delete it.
1 parent 2fa3a03 commit ffc8919

File tree

7 files changed

+68
-114
lines changed

7 files changed

+68
-114
lines changed

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

Lines changed: 1 addition & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @flow
88
*/
99

10-
import type {FiberRoot, ReactPriorityLevel} from './ReactInternalTypes';
10+
import type {FiberRoot} from './ReactInternalTypes';
1111

1212
// TODO: Ideally these types would be opaque but that doesn't work well with
1313
// our reconciler fork infra, since these leak into non-reconciler packages.
@@ -35,17 +35,8 @@ export type Lanes = number;
3535
export type Lane = number;
3636
export type LaneMap<T> = Array<T>;
3737

38-
import invariant from 'shared/invariant';
3938
import {enableCache, enableSchedulingProfiler} from 'shared/ReactFeatureFlags';
4039

41-
import {
42-
ImmediatePriority as ImmediateSchedulerPriority,
43-
UserBlockingPriority as UserBlockingSchedulerPriority,
44-
NormalPriority as NormalSchedulerPriority,
45-
IdlePriority as IdleSchedulerPriority,
46-
NoPriority as NoSchedulerPriority,
47-
} from './SchedulerWithReactIntegration.new';
48-
4940
export const SyncLanePriority: LanePriority = 12;
5041

5142
const InputContinuousHydrationLanePriority: LanePriority = 11;
@@ -244,37 +235,6 @@ function getHighestPriorityLanes(lanes: Lanes | Lane): Lanes {
244235
}
245236
}
246237

247-
export function lanePriorityToSchedulerPriority(
248-
lanePriority: LanePriority,
249-
): ReactPriorityLevel {
250-
switch (lanePriority) {
251-
case SyncLanePriority:
252-
return ImmediateSchedulerPriority;
253-
case InputContinuousHydrationLanePriority:
254-
case InputContinuousLanePriority:
255-
return UserBlockingSchedulerPriority;
256-
case DefaultHydrationLanePriority:
257-
case DefaultLanePriority:
258-
case TransitionHydrationPriority:
259-
case TransitionPriority:
260-
case SelectiveHydrationLanePriority:
261-
case RetryLanePriority:
262-
return NormalSchedulerPriority;
263-
case IdleHydrationLanePriority:
264-
case IdleLanePriority:
265-
case OffscreenLanePriority:
266-
return IdleSchedulerPriority;
267-
case NoLanePriority:
268-
return NoSchedulerPriority;
269-
default:
270-
invariant(
271-
false,
272-
'Invalid update priority: %s. This is a bug in React.',
273-
lanePriority,
274-
);
275-
}
276-
}
277-
278238
export function getNextLanes(root: FiberRoot, wipLanes: Lanes): Lanes {
279239
// Early bailout if there's no pending work left.
280240
const pendingLanes = root.pendingLanes;

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

Lines changed: 1 addition & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @flow
88
*/
99

10-
import type {FiberRoot, ReactPriorityLevel} from './ReactInternalTypes';
10+
import type {FiberRoot} from './ReactInternalTypes';
1111

1212
// TODO: Ideally these types would be opaque but that doesn't work well with
1313
// our reconciler fork infra, since these leak into non-reconciler packages.
@@ -35,17 +35,8 @@ export type Lanes = number;
3535
export type Lane = number;
3636
export type LaneMap<T> = Array<T>;
3737

38-
import invariant from 'shared/invariant';
3938
import {enableCache, enableSchedulingProfiler} from 'shared/ReactFeatureFlags';
4039

41-
import {
42-
ImmediatePriority as ImmediateSchedulerPriority,
43-
UserBlockingPriority as UserBlockingSchedulerPriority,
44-
NormalPriority as NormalSchedulerPriority,
45-
IdlePriority as IdleSchedulerPriority,
46-
NoPriority as NoSchedulerPriority,
47-
} from './SchedulerWithReactIntegration.old';
48-
4940
export const SyncLanePriority: LanePriority = 12;
5041

5142
const InputContinuousHydrationLanePriority: LanePriority = 11;
@@ -244,37 +235,6 @@ function getHighestPriorityLanes(lanes: Lanes | Lane): Lanes {
244235
}
245236
}
246237

247-
export function lanePriorityToSchedulerPriority(
248-
lanePriority: LanePriority,
249-
): ReactPriorityLevel {
250-
switch (lanePriority) {
251-
case SyncLanePriority:
252-
return ImmediateSchedulerPriority;
253-
case InputContinuousHydrationLanePriority:
254-
case InputContinuousLanePriority:
255-
return UserBlockingSchedulerPriority;
256-
case DefaultHydrationLanePriority:
257-
case DefaultLanePriority:
258-
case TransitionHydrationPriority:
259-
case TransitionPriority:
260-
case SelectiveHydrationLanePriority:
261-
case RetryLanePriority:
262-
return NormalSchedulerPriority;
263-
case IdleHydrationLanePriority:
264-
case IdleLanePriority:
265-
case OffscreenLanePriority:
266-
return IdleSchedulerPriority;
267-
case NoLanePriority:
268-
return NoSchedulerPriority;
269-
default:
270-
invariant(
271-
false,
272-
'Invalid update priority: %s. This is a bug in React.',
273-
lanePriority,
274-
);
275-
}
276-
}
277-
278238
export function getNextLanes(root: FiberRoot, wipLanes: Lanes): Lanes {
279239
// Early bailout if there's no pending work left.
280240
const pendingLanes = root.pendingLanes;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ import type {RootTag} from './ReactRootTags';
1313
import {noTimeout, supportsHydration} from './ReactFiberHostConfig';
1414
import {createHostRootFiber} from './ReactFiber.new';
1515
import {
16+
NoLane,
1617
NoLanes,
17-
NoLanePriority,
1818
NoTimestamp,
1919
createLaneMap,
2020
} from './ReactFiberLane.new';
@@ -41,7 +41,7 @@ function FiberRootNode(containerInfo, tag, hydrate) {
4141
this.pendingContext = null;
4242
this.hydrate = hydrate;
4343
this.callbackNode = null;
44-
this.callbackPriority = NoLanePriority;
44+
this.callbackPriority = NoLane;
4545
this.eventTimes = createLaneMap(NoLanes);
4646
this.expirationTimes = createLaneMap(NoTimestamp);
4747

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ import type {RootTag} from './ReactRootTags';
1313
import {noTimeout, supportsHydration} from './ReactFiberHostConfig';
1414
import {createHostRootFiber} from './ReactFiber.old';
1515
import {
16+
NoLane,
1617
NoLanes,
17-
NoLanePriority,
1818
NoTimestamp,
1919
createLaneMap,
2020
} from './ReactFiberLane.old';
@@ -41,7 +41,7 @@ function FiberRootNode(containerInfo, tag, hydrate) {
4141
this.pendingContext = null;
4242
this.hydrate = hydrate;
4343
this.callbackNode = null;
44-
this.callbackPriority = NoLanePriority;
44+
this.callbackPriority = NoLane;
4545
this.eventTimes = createLaneMap(NoLanes);
4646
this.expirationTimes = createLaneMap(NoTimestamp);
4747

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

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ import {
4343
requestPaint,
4444
now,
4545
ImmediatePriority as ImmediateSchedulerPriority,
46+
UserBlockingPriority as UserBlockingSchedulerPriority,
4647
NormalPriority as NormalSchedulerPriority,
48+
IdlePriority as IdleSchedulerPriority,
4749
flushSyncCallbackQueue,
4850
scheduleSyncCallback,
4951
} from './SchedulerWithReactIntegration.new';
@@ -130,8 +132,6 @@ import {
130132
MountLayoutDev,
131133
} from './ReactFiberFlags';
132134
import {
133-
NoLanePriority,
134-
SyncLanePriority,
135135
NoLanes,
136136
NoLane,
137137
SyncLane,
@@ -147,7 +147,6 @@ import {
147147
includesOnlyRetries,
148148
includesOnlyTransitions,
149149
getNextLanes,
150-
returnNextLanesPriority,
151150
markStarvedLanesAsExpired,
152151
getLanesToRetrySynchronouslyOnError,
153152
getMostRecentEventTime,
@@ -156,11 +155,13 @@ import {
156155
markRootPinged,
157156
markRootExpired,
158157
markRootFinished,
159-
lanePriorityToSchedulerPriority,
158+
getHighestPriorityLane,
160159
} from './ReactFiberLane.new';
161160
import {
162161
DiscreteEventPriority,
162+
ContinuousEventPriority,
163163
DefaultEventPriority,
164+
IdleEventPriority,
164165
getCurrentUpdatePriority,
165166
setCurrentUpdatePriority,
166167
lowerEventPriority,
@@ -652,19 +653,20 @@ function ensureRootIsScheduled(root: FiberRoot, currentTime: number) {
652653
root,
653654
root === workInProgressRoot ? workInProgressRootRenderLanes : NoLanes,
654655
);
655-
// This returns the priority level computed during the `getNextLanes` call.
656-
const newCallbackPriority = returnNextLanesPriority();
657656

658657
if (nextLanes === NoLanes) {
659658
// Special case: There's nothing to work on.
660659
if (existingCallbackNode !== null) {
661660
cancelCallback(existingCallbackNode);
662661
}
663662
root.callbackNode = null;
664-
root.callbackPriority = NoLanePriority;
663+
root.callbackPriority = NoLane;
665664
return;
666665
}
667666

667+
// We use the highest priority lane to represent the priority of the callback.
668+
const newCallbackPriority = getHighestPriorityLane(nextLanes);
669+
668670
// Check if there's an existing task. We may be able to reuse it.
669671
const existingCallbackPriority = root.callbackPriority;
670672
if (existingCallbackPriority === newCallbackPriority) {
@@ -674,7 +676,7 @@ function ensureRootIsScheduled(root: FiberRoot, currentTime: number) {
674676
// TODO: Temporary until we confirm this warning is not fired.
675677
if (
676678
existingCallbackNode == null &&
677-
existingCallbackPriority !== SyncLanePriority
679+
existingCallbackPriority !== SyncLane
678680
) {
679681
console.error(
680682
'Expected scheduled callback to exist. This error is likely caused by a bug in React. Please file an issue.',
@@ -692,7 +694,7 @@ function ensureRootIsScheduled(root: FiberRoot, currentTime: number) {
692694

693695
// Schedule a new callback.
694696
let newCallbackNode;
695-
if (newCallbackPriority === SyncLanePriority) {
697+
if (newCallbackPriority === SyncLane) {
696698
// Special case: Sync React callbacks are scheduled on a special
697699
// internal queue
698700
scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root));
@@ -705,9 +707,24 @@ function ensureRootIsScheduled(root: FiberRoot, currentTime: number) {
705707
}
706708
newCallbackNode = null;
707709
} else {
708-
const schedulerPriorityLevel = lanePriorityToSchedulerPriority(
709-
newCallbackPriority,
710-
);
710+
let schedulerPriorityLevel;
711+
switch (lanesToEventPriority(nextLanes)) {
712+
case DiscreteEventPriority:
713+
schedulerPriorityLevel = ImmediateSchedulerPriority;
714+
break;
715+
case ContinuousEventPriority:
716+
schedulerPriorityLevel = UserBlockingSchedulerPriority;
717+
break;
718+
case DefaultEventPriority:
719+
schedulerPriorityLevel = NormalSchedulerPriority;
720+
break;
721+
case IdleEventPriority:
722+
schedulerPriorityLevel = IdleSchedulerPriority;
723+
break;
724+
default:
725+
schedulerPriorityLevel = NormalSchedulerPriority;
726+
break;
727+
}
711728
newCallbackNode = scheduleCallback(
712729
schedulerPriorityLevel,
713730
performConcurrentWorkOnRoot.bind(null, root),
@@ -1739,7 +1756,7 @@ function commitRootImpl(root, renderPriorityLevel) {
17391756
// commitRoot never returns a continuation; it always finishes synchronously.
17401757
// So we can clear these now to allow a new callback to be scheduled.
17411758
root.callbackNode = null;
1742-
root.callbackPriority = NoLanePriority;
1759+
root.callbackPriority = NoLane;
17431760

17441761
// Update the first and last pending times on this root. The new first
17451762
// pending time is whatever is left on the root fiber.

0 commit comments

Comments
 (0)