From 240588b6d43010fa98a73cc614d42920cdb3ea51 Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Wed, 14 Apr 2021 02:51:26 -0700 Subject: [PATCH] Implement RuntimeScheduler::now Summary: Changelog: [internal] Implement RuntimeScheduler::now and exposite it to JavaScript. JavaScripts expects miliseconds and is using `performance.now()` call to get this value. More about `performance.now()`: https://developer.mozilla.org/en-US/docs/Web/API/Performance/now JavaScript implementation in Scheduler: https://github.com/facebook/react/blob/master/packages/scheduler/src/forks/SchedulerNoDOM.js#L71-L82 Reviewed By: JoshuaGross Differential Revision: D27675512 fbshipit-source-id: bce5ac700e71b1722cd280dfbdd15e141783a3a5 --- .../runtimescheduler/RuntimeScheduler.cpp | 4 ++++ .../runtimescheduler/RuntimeScheduler.h | 8 ++++++++ .../RuntimeSchedulerBinding.cpp | 19 +++++++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.cpp b/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.cpp index d7978b95f6f..e257d1f6e32 100644 --- a/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.cpp +++ b/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.cpp @@ -30,4 +30,8 @@ bool RuntimeScheduler::getShouldYield() const { return shouldYield_; } +RuntimeSchedulerClock::time_point RuntimeScheduler::now() const { + return RuntimeSchedulerClock::now(); +} + } // namespace facebook::react diff --git a/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.h b/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.h index be0059853a7..a1af49551fd 100644 --- a/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.h +++ b/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.h @@ -10,11 +10,17 @@ #include #include #include +#include #include #include namespace facebook::react { +/* + * Represents a monotonic clock suitable for measuring intervals. + */ +using RuntimeSchedulerClock = std::chrono::steady_clock; + class RuntimeScheduler final { public: RuntimeScheduler(RuntimeExecutor const &runtimeExecutor); @@ -25,6 +31,8 @@ class RuntimeScheduler final { bool getShouldYield() const; + RuntimeSchedulerClock::time_point now() const; + private: mutable std::priority_queue< std::shared_ptr, diff --git a/ReactCommon/react/renderer/runtimescheduler/RuntimeSchedulerBinding.cpp b/ReactCommon/react/renderer/runtimescheduler/RuntimeSchedulerBinding.cpp index 71da7c66cc8..c2a72ef7572 100644 --- a/ReactCommon/react/renderer/runtimescheduler/RuntimeSchedulerBinding.cpp +++ b/ReactCommon/react/renderer/runtimescheduler/RuntimeSchedulerBinding.cpp @@ -10,6 +10,7 @@ #include "primitives.h" #include +#include #include namespace facebook::react { @@ -115,6 +116,24 @@ jsi::Value RuntimeSchedulerBinding::get( }); } + if (propertyName == "unstable_now") { + return jsi::Function::createFromHostFunction( + runtime, + name, + 0, + [this]( + jsi::Runtime &, + jsi::Value const &, + jsi::Value const *, + size_t) noexcept -> jsi::Value { + auto now = runtimeScheduler_->now(); + auto asDouble = + std::chrono::duration(now.time_since_epoch()) + .count(); + return jsi::Value(asDouble); + }); + } + if (propertyName == "unstable_ImmediatePriority") { return jsi::Value(runtime, serialize(SchedulerPriority::ImmediatePriority)); }