Implement RuntimeScheduler::getCurrentPriorityLevel

Summary:
Changelog: [internal]

Implement `RuntimeScheduler::getCurrentPriorityLevel`.

JavaScript implementation: https://github.com/facebook/react/blob/master/packages/scheduler/src/forks/SchedulerNoDOM.js#L63

Reviewed By: ShikaSD

Differential Revision: D27998510

fbshipit-source-id: 634c09185f9eae8f7afcdb6acd9b74effd587da7
This commit is contained in:
Samuel Susla 2021-04-27 00:26:47 -07:00 коммит произвёл Facebook GitHub Bot
Родитель 46ffe84453
Коммит 841756b150
4 изменённых файлов: 58 добавлений и 6 удалений

Просмотреть файл

@ -29,27 +29,28 @@ std::shared_ptr<Task> RuntimeScheduler::scheduleTask(
isCallbackScheduled_ = true;
runtimeExecutor_([this](jsi::Runtime &runtime) {
isCallbackScheduled_ = false;
auto previousPriority = currentPriority_;
while (!taskQueue_.empty()) {
auto topPriority = taskQueue_.top();
auto topPriorityTask = taskQueue_.top();
auto now = now_();
auto didUserCallbackTimeout = topPriority->expirationTime <= now;
auto didUserCallbackTimeout = topPriorityTask->expirationTime <= now;
if (!didUserCallbackTimeout && shouldYield_) {
// This task hasn't expired and we need to yield.
break;
}
auto result = topPriority->execute(runtime);
currentPriority_ = topPriorityTask->priority;
auto result = topPriorityTask->execute(runtime);
if (result.isObject() &&
result.getObject(runtime).isFunction(runtime)) {
topPriority->callback =
topPriorityTask->callback =
result.getObject(runtime).getFunction(runtime);
} else {
taskQueue_.pop();
}
}
currentPriority_ = previousPriority;
});
}
@ -64,6 +65,10 @@ bool RuntimeScheduler::getShouldYield() const {
return shouldYield_;
}
SchedulerPriority RuntimeScheduler::getCurrentPriorityLevel() const {
return currentPriority_;
}
RuntimeSchedulerTimePoint RuntimeScheduler::now() const {
return now_();
}

Просмотреть файл

@ -31,6 +31,8 @@ class RuntimeScheduler final {
bool getShouldYield() const;
SchedulerPriority getCurrentPriorityLevel() const;
RuntimeSchedulerTimePoint now() const;
private:
@ -40,6 +42,7 @@ class RuntimeScheduler final {
TaskPriorityComparer>
taskQueue_;
RuntimeExecutor const runtimeExecutor_;
SchedulerPriority currentPriority_{SchedulerPriority::NormalPriority};
std::atomic_bool shouldYield_{false};
/*

Просмотреть файл

@ -133,6 +133,11 @@ jsi::Value RuntimeSchedulerBinding::get(
});
}
if (propertyName == "unstable_getCurrentPriorityLevel") {
auto currentPriorityLevel = runtimeScheduler_->getCurrentPriorityLevel();
return jsi::Value(runtime, serialize(currentPriorityLevel));
}
if (propertyName == "unstable_ImmediatePriority") {
return jsi::Value(runtime, serialize(SchedulerPriority::ImmediatePriority));
}

Просмотреть файл

@ -273,4 +273,43 @@ TEST_F(RuntimeSchedulerTest, continuationTask) {
EXPECT_EQ(stubQueue_->size(), 0);
}
TEST_F(RuntimeSchedulerTest, getCurrentPriorityLevel) {
auto callback =
createHostFunctionFromLambda([this](bool didUserCallbackTimeout) {
EXPECT_EQ(
runtimeScheduler_->getCurrentPriorityLevel(),
SchedulerPriority::ImmediatePriority);
return jsi::Value::undefined();
});
EXPECT_EQ(
runtimeScheduler_->getCurrentPriorityLevel(),
SchedulerPriority::NormalPriority);
runtimeScheduler_->scheduleTask(
SchedulerPriority::ImmediatePriority, std::move(callback));
stubQueue_->tick();
EXPECT_EQ(
runtimeScheduler_->getCurrentPriorityLevel(),
SchedulerPriority::NormalPriority);
callback = createHostFunctionFromLambda([this](bool didUserCallbackTimeout) {
EXPECT_EQ(
runtimeScheduler_->getCurrentPriorityLevel(),
SchedulerPriority::IdlePriority);
return jsi::Value::undefined();
});
runtimeScheduler_->scheduleTask(
SchedulerPriority::IdlePriority, std::move(callback));
stubQueue_->tick();
EXPECT_EQ(
runtimeScheduler_->getCurrentPriorityLevel(),
SchedulerPriority::NormalPriority);
}
} // namespace facebook::react