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:
Родитель
46ffe84453
Коммит
841756b150
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче