Skip to content

Commit

Permalink
Remove priority coalescing and PriorityLevel module
Browse files Browse the repository at this point in the history
Coalescing is the only feature that depends on PriorityLevel. Since
we're not sure if coalescing is even valuable, we'll remove it for
now. If it turns out we need it, we can add it back later.
  • Loading branch information
acdlite committed Oct 10, 2017
1 parent 18f408f commit 3e36db5
Show file tree
Hide file tree
Showing 9 changed files with 122 additions and 363 deletions.
10 changes: 0 additions & 10 deletions src/renderers/shared/fiber/ReactFiber.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ import type {
import type {TypeOfWork} from 'ReactTypeOfWork';
import type {TypeOfInternalContext} from 'ReactTypeOfInternalContext';
import type {TypeOfSideEffect} from 'ReactTypeOfSideEffect';
import type {PriorityLevel} from 'ReactPriorityLevel';
import type {ExpirationTime} from 'ReactFiberExpirationTime';
import type {UpdateQueue} from 'ReactFiberUpdateQueue';

Expand All @@ -36,8 +35,6 @@ var {
Fragment,
} = require('ReactTypeOfWork');

var {NoWork: NoWorkPriority} = require('ReactPriorityLevel');

var {NoWork} = require('ReactFiberExpirationTime');

var {NoContext} = require('ReactTypeOfInternalContext');
Expand Down Expand Up @@ -452,10 +449,3 @@ exports.createFiberFromPortal = function(
};
return fiber;
};

exports.largerPriority = function(
p1: PriorityLevel,
p2: PriorityLevel,
): PriorityLevel {
return p1 !== NoWorkPriority && (p2 === NoWorkPriority || p2 > p1) ? p1 : p2;
};
15 changes: 2 additions & 13 deletions src/renderers/shared/fiber/ReactFiberBeginWork.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import type {HostContext} from 'ReactFiberHostContext';
import type {HydrationContext} from 'ReactFiberHydrationContext';
import type {FiberRoot} from 'ReactFiberRoot';
import type {HostConfig} from 'ReactFiberReconciler';
import type {PriorityLevel} from 'ReactPriorityLevel';
import type {ExpirationTime} from 'ReactFiberExpirationTime';

var {
Expand Down Expand Up @@ -73,15 +72,7 @@ module.exports = function<T, P, I, TI, PI, C, CX, PL>(
hostContext: HostContext<C, CX>,
hydrationContext: HydrationContext<C, CX>,
scheduleUpdate: (fiber: Fiber, expirationTime: ExpirationTime) => void,
getPriorityContext: (
fiber: Fiber,
forceAsync: boolean,
) => PriorityLevel | null,
recalculateCurrentTime: () => ExpirationTime,
getExpirationTimeForPriority: (
currentTime: ExpirationTime,
priorityLevel: PriorityLevel | null,
) => ExpirationTime,
getExpirationTime: (fiber: Fiber, forceAsync: boolean) => ExpirationTime,
) {
const {
shouldSetTextContent,
Expand All @@ -105,11 +96,9 @@ module.exports = function<T, P, I, TI, PI, C, CX, PL>(
updateClassInstance,
} = ReactFiberClassComponent(
scheduleUpdate,
getPriorityContext,
getExpirationTime,
memoizeProps,
memoizeState,
recalculateCurrentTime,
getExpirationTimeForPriority,
);

// TODO: Remove this and use reconcileChildrenAtExpirationTime directly.
Expand Down
58 changes: 7 additions & 51 deletions src/renderers/shared/fiber/ReactFiberClassComponent.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
'use strict';

import type {Fiber} from 'ReactFiber';
import type {PriorityLevel} from 'ReactPriorityLevel';
import type {ExpirationTime} from 'ReactFiberExpirationTime';

var {Update} = require('ReactTypeOfSideEffect');
Expand Down Expand Up @@ -79,84 +78,41 @@ if (__DEV__) {

module.exports = function(
scheduleUpdate: (fiber: Fiber, expirationTime: ExpirationTime) => void,
getPriorityContext: (
fiber: Fiber,
forceAsync: boolean,
) => PriorityLevel | null,
getExpirationTime: (fiber: Fiber, forceAsync: boolean) => ExpirationTime,
memoizeProps: (workInProgress: Fiber, props: any) => void,
memoizeState: (workInProgress: Fiber, state: any) => void,
recalculateCurrentTime: () => ExpirationTime,
getExpirationTimeForPriority: (
currentTime: ExpirationTime,
priorityLevel: PriorityLevel | null,
) => ExpirationTime,
) {
// Class component state updater
const updater = {
isMounted,
enqueueSetState(instance, partialState, callback) {
const fiber = ReactInstanceMap.get(instance);
const priorityLevel = getPriorityContext(fiber, false);
const currentTime = recalculateCurrentTime();
const expirationTime = getExpirationTimeForPriority(
currentTime,
priorityLevel,
);
const expirationTime = getExpirationTime(fiber, false);
callback = callback === undefined ? null : callback;
if (__DEV__) {
warnOnInvalidCallback(callback, 'setState');
}
addUpdate(
fiber,
partialState,
callback,
priorityLevel,
expirationTime,
currentTime,
);
addUpdate(fiber, partialState, callback, expirationTime);
scheduleUpdate(fiber, expirationTime);
},
enqueueReplaceState(instance, state, callback) {
const fiber = ReactInstanceMap.get(instance);
const priorityLevel = getPriorityContext(fiber, false);
const currentTime = recalculateCurrentTime();
const expirationTime = getExpirationTimeForPriority(
currentTime,
priorityLevel,
);
const expirationTime = getExpirationTime(fiber, false);
callback = callback === undefined ? null : callback;
if (__DEV__) {
warnOnInvalidCallback(callback, 'replaceState');
}
addReplaceUpdate(
fiber,
state,
callback,
priorityLevel,
expirationTime,
currentTime,
);
addReplaceUpdate(fiber, state, callback, expirationTime);
scheduleUpdate(fiber, expirationTime);
},
enqueueForceUpdate(instance, callback) {
const fiber = ReactInstanceMap.get(instance);
const priorityLevel = getPriorityContext(fiber, false);
const currentTime = recalculateCurrentTime();
const expirationTime = getExpirationTimeForPriority(
currentTime,
priorityLevel,
);
const expirationTime = getExpirationTime(fiber, false);
callback = callback === undefined ? null : callback;
if (__DEV__) {
warnOnInvalidCallback(callback, 'forceUpdate');
}
addForceUpdate(
fiber,
callback,
priorityLevel,
expirationTime,
currentTime,
);
addForceUpdate(fiber, callback, expirationTime);
scheduleUpdate(fiber, expirationTime);
},
};
Expand Down
82 changes: 19 additions & 63 deletions src/renderers/shared/fiber/ReactFiberExpirationTime.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,6 @@

'use strict';

import type {PriorityLevel} from 'ReactPriorityLevel';
const {
NoWork: NoWorkPriority,
SynchronousPriority,
TaskPriority,
HighPriority,
LowPriority,
OffscreenPriority,
} = require('ReactPriorityLevel');

const invariant = require('fbjs/lib/invariant');

// TODO: Use an opaque type once ESLint et al support the syntax
export type ExpirationTime = number;

Expand All @@ -33,6 +21,8 @@ const Never = 2147483647; // Max int32: Math.pow(2, 31) - 1
const UNIT_SIZE = 10;
const MAGIC_NUMBER_OFFSET = 3;

exports.Sync = Sync;
exports.Task = Task;
exports.NoWork = NoWork;
exports.Never = Never;

Expand All @@ -58,66 +48,32 @@ function bucket(
);
}

// Given the current clock time and a priority level, returns an expiration time
// that represents a point in the future by which some work should complete.
// The lower the priority, the further out the expiration time. We use rounding
// to batch like updates together. The further out the expiration time, the
// more we want to batch, so we use a larger precision when rounding.
function priorityToExpirationTime(
currentTime: ExpirationTime,
priorityLevel: PriorityLevel,
): ExpirationTime {
switch (priorityLevel) {
case NoWork:
return NoWorkPriority;
case SynchronousPriority:
return Sync;
case TaskPriority:
return Task;
case HighPriority: {
// Should complete within ~100ms. 120ms max.
return bucket(currentTime, 100, 20);
}
case LowPriority: {
// Should complete within ~1000ms. 1200ms max.
return bucket(currentTime, 1000, 200);
}
case OffscreenPriority:
return Never;
default:
invariant(
false,
'Switch statement should be exhuastive. ' +
'This error is likely caused by a bug in React. Please file an issue.',
);
}
// Given the current clock time, returns an expiration time. We use rounding
// to batch like updates together.
function asyncExpirationTime(currentTime: ExpirationTime) {
// Should complete within ~1000ms. 1200ms max.
return bucket(currentTime, 1000, 200);
}
exports.priorityToExpirationTime = priorityToExpirationTime;
exports.asyncExpirationTime = asyncExpirationTime;

// Given the current clock time and an expiration time, returns the
// corresponding priority level. The more time has advanced, the higher the
// priority level.
function expirationTimeToPriorityLevel(
// relative expiration time. Possible values include NoWork, Sync, Task, and
// Never. All other values represent an async expiration time.
function relativeExpirationTime(
currentTime: ExpirationTime,
expirationTime: ExpirationTime,
): PriorityLevel {
// First check for magic values
): ExpirationTime {
switch (expirationTime) {
case NoWorkPriority:
return NoWork;
case NoWork:
case Sync:
return SynchronousPriority;
case Task:
return TaskPriority;
case Never:
return OffscreenPriority;
default:
break;
return expirationTime;
}
if (expirationTime <= currentTime) {
return TaskPriority;
const delta = expirationTime - currentTime;
if (delta <= 0) {
return Task;
}
// TODO: We don't currently distinguish between high and low priority.
return LowPriority;
return msToExpirationTime(delta);
}
exports.expirationTimeToPriorityLevel = expirationTimeToPriorityLevel;
exports.relativeExpirationTime = relativeExpirationTime;
20 changes: 3 additions & 17 deletions src/renderers/shared/fiber/ReactFiberReconciler.js
Original file line number Diff line number Diff line change
Expand Up @@ -236,9 +236,7 @@ module.exports = function<T, P, I, TI, PI, C, CX, PL>(

var {
scheduleUpdate,
getPriorityContext,
getExpirationTimeForPriority,
recalculateCurrentTime,
getExpirationTime,
batchedUpdates,
unbatchedUpdates,
flushSync,
Expand Down Expand Up @@ -277,12 +275,7 @@ module.exports = function<T, P, I, TI, PI, C, CX, PL>(
element.type != null &&
element.type.prototype != null &&
(element.type.prototype: any).unstable_isAsyncReactComponent === true;
const priorityLevel = getPriorityContext(current, forceAsync);
const currentTime = recalculateCurrentTime();
const expirationTime = getExpirationTimeForPriority(
currentTime,
priorityLevel,
);
const expirationTime = getExpirationTime(current, forceAsync);
const nextState = {element};
callback = callback === undefined ? null : callback;
if (__DEV__) {
Expand All @@ -293,14 +286,7 @@ module.exports = function<T, P, I, TI, PI, C, CX, PL>(
callback,
);
}
addTopLevelUpdate(
current,
nextState,
callback,
priorityLevel,
expirationTime,
currentTime,
);
addTopLevelUpdate(current, nextState, callback, expirationTime);
scheduleUpdate(current, expirationTime);
}

Expand Down

0 comments on commit 3e36db5

Please sign in to comment.