1*5f154df9Saleqsio #ifdef __APPLE__
2*5f154df9Saleqsio #include <RNReanimated/Scheduler.h>
3*5f154df9Saleqsio #else
404819bfdSŁukasz Kosmaty #include "Scheduler.h"
5*5f154df9Saleqsio #endif
6*5f154df9Saleqsio #include "ReanimatedRuntime.h"
7*5f154df9Saleqsio #include "RuntimeManager.h"
804819bfdSŁukasz Kosmaty 
904819bfdSŁukasz Kosmaty namespace reanimated {
1004819bfdSŁukasz Kosmaty 
scheduleOnUI(std::function<void ()> job)1104819bfdSŁukasz Kosmaty void Scheduler::scheduleOnUI(std::function<void()> job) {
1204819bfdSŁukasz Kosmaty   uiJobs.push(std::move(job));
1304819bfdSŁukasz Kosmaty }
1404819bfdSŁukasz Kosmaty 
scheduleOnJS(std::function<void ()> job)1504819bfdSŁukasz Kosmaty void Scheduler::scheduleOnJS(std::function<void()> job) {
1604819bfdSŁukasz Kosmaty   jsCallInvoker_->invokeAsync(std::move(job));
1704819bfdSŁukasz Kosmaty }
1804819bfdSŁukasz Kosmaty 
triggerUI()1904819bfdSŁukasz Kosmaty void Scheduler::triggerUI() {
2004819bfdSŁukasz Kosmaty   scheduledOnUI = false;
21*5f154df9Saleqsio #if JS_RUNTIME_HERMES
22*5f154df9Saleqsio   // JSI's scope defined here allows for JSI-objects to be cleared up after
23*5f154df9Saleqsio   // each runtime loop. Within these loops we typically create some temporary
24*5f154df9Saleqsio   // JSI objects and hence it allows for such objects to be garbage collected
25*5f154df9Saleqsio   // much sooner.
26*5f154df9Saleqsio   // Apparently the scope API is only supported on Hermes at the moment.
27*5f154df9Saleqsio   auto scope = jsi::Scope(*runtimeManager.lock()->runtime);
28*5f154df9Saleqsio #endif
2904819bfdSŁukasz Kosmaty   while (uiJobs.getSize()) {
3004819bfdSŁukasz Kosmaty     auto job = uiJobs.pop();
3104819bfdSŁukasz Kosmaty     job();
3204819bfdSŁukasz Kosmaty   }
3304819bfdSŁukasz Kosmaty }
3404819bfdSŁukasz Kosmaty 
setJSCallInvoker(std::shared_ptr<facebook::react::CallInvoker> jsCallInvoker)3504819bfdSŁukasz Kosmaty void Scheduler::setJSCallInvoker(
3604819bfdSŁukasz Kosmaty     std::shared_ptr<facebook::react::CallInvoker> jsCallInvoker) {
3704819bfdSŁukasz Kosmaty   jsCallInvoker_ = jsCallInvoker;
3804819bfdSŁukasz Kosmaty }
3904819bfdSŁukasz Kosmaty 
setRuntimeManager(std::shared_ptr<RuntimeManager> runtimeManager)4004819bfdSŁukasz Kosmaty void Scheduler::setRuntimeManager(
4104819bfdSŁukasz Kosmaty     std::shared_ptr<RuntimeManager> runtimeManager) {
4204819bfdSŁukasz Kosmaty   this->runtimeManager = runtimeManager;
4304819bfdSŁukasz Kosmaty }
4404819bfdSŁukasz Kosmaty 
~Scheduler()4504819bfdSŁukasz Kosmaty Scheduler::~Scheduler() {}
4604819bfdSŁukasz Kosmaty 
Scheduler()4704819bfdSŁukasz Kosmaty Scheduler::Scheduler() {
4804819bfdSŁukasz Kosmaty   this->scheduledOnUI = false;
4904819bfdSŁukasz Kosmaty }
5004819bfdSŁukasz Kosmaty 
5104819bfdSŁukasz Kosmaty } // namespace reanimated
52