From 8972ae8e03b18f5cf89cd131ce5b48a5efcd153b Mon Sep 17 00:00:00 2001 From: Andrew Clark Date: Fri, 11 Aug 2017 13:52:29 -0700 Subject: [PATCH] Use current time to calculate expiration time --- .../shared/fiber/ReactFiberExpirationTime.js | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/renderers/shared/fiber/ReactFiberExpirationTime.js b/src/renderers/shared/fiber/ReactFiberExpirationTime.js index 39493cb436764..e05234a384e18 100644 --- a/src/renderers/shared/fiber/ReactFiberExpirationTime.js +++ b/src/renderers/shared/fiber/ReactFiberExpirationTime.js @@ -32,6 +32,7 @@ const Sync = 1; const Task = 2; const Never = Infinity; +const UNIT_SIZE = 10; const MAGIC_NUMBER_OFFSET = 10; exports.Done = Done; @@ -40,16 +41,27 @@ exports.Never = Infinity; // 1 unit of expiration time represents 10ms. function msToExpirationTime(ms: number): ExpirationTime { // Always add an offset so that we don't clash with the magic number for Done. - return Math.round(ms / 10) + MAGIC_NUMBER_OFFSET; + return Math.round(ms / UNIT_SIZE) + MAGIC_NUMBER_OFFSET; } exports.msToExpirationTime = msToExpirationTime; function expirationTimeToMs(expirationTime: ExpirationTime): number { - return (expirationTime - MAGIC_NUMBER_OFFSET) * 10; + return (expirationTime - MAGIC_NUMBER_OFFSET) * UNIT_SIZE; } -function ceiling(time: ExpirationTime, precision: number): ExpirationTime { - return Math.ceil(Math.ceil(time * precision) / precision); +function ceiling(num: number, precision: number): number { + return Math.ceil(Math.ceil(num * precision) / precision); +} + +function bucket( + currentTime: ExpirationTime, + expirationInMs: number, + precisionInMs: number, +): ExpirationTime { + return ceiling( + currentTime + expirationInMs / UNIT_SIZE, + precisionInMs / UNIT_SIZE, + ); } // Given the current clock time and a priority level, returns an expiration time @@ -68,12 +80,14 @@ function priorityToExpirationTime( return Sync; case TaskPriority: return Task; - case HighPriority: + case HighPriority: { // Should complete within ~100ms. 120ms max. - return msToExpirationTime(ceiling(100, 20)); - case LowPriority: + return bucket(currentTime, 100, 20); + } + case LowPriority: { // Should complete within ~1000ms. 1200ms max. - return msToExpirationTime(ceiling(1000, 200)); + return bucket(currentTime, 1000, 200); + } case OffscreenPriority: return Never; default: