1*5f154df9Saleqsio #ifdef __APPLE__
2*5f154df9Saleqsio #include <RNReanimated/Scheduler.h>
3*5f154df9Saleqsio #else
4a48bc6c0SBrent Vatne #include "Scheduler.h"
5*5f154df9Saleqsio #endif
6*5f154df9Saleqsio #include "ReanimatedRuntime.h"
7*5f154df9Saleqsio #include "RuntimeManager.h"
8a48bc6c0SBrent Vatne 
9c7e4709dSKudo Chien namespace reanimated {
10a48bc6c0SBrent Vatne 
scheduleOnUI(std::function<void ()> job)11a48bc6c0SBrent Vatne void Scheduler::scheduleOnUI(std::function<void()> job) {
12a48bc6c0SBrent Vatne   uiJobs.push(std::move(job));
13a48bc6c0SBrent Vatne }
14a48bc6c0SBrent Vatne 
scheduleOnJS(std::function<void ()> job)15a48bc6c0SBrent Vatne void Scheduler::scheduleOnJS(std::function<void()> job) {
16a48bc6c0SBrent Vatne   jsCallInvoker_->invokeAsync(std::move(job));
17a48bc6c0SBrent Vatne }
18a48bc6c0SBrent Vatne 
triggerUI()19a48bc6c0SBrent Vatne void Scheduler::triggerUI() {
20c7e4709dSKudo Chien   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
29c7e4709dSKudo Chien   while (uiJobs.getSize()) {
30a48bc6c0SBrent Vatne     auto job = uiJobs.pop();
31a48bc6c0SBrent Vatne     job();
32a48bc6c0SBrent Vatne   }
33c7e4709dSKudo Chien }
34a48bc6c0SBrent Vatne 
setJSCallInvoker(std::shared_ptr<facebook::react::CallInvoker> jsCallInvoker)35c7e4709dSKudo Chien void Scheduler::setJSCallInvoker(
36c7e4709dSKudo Chien     std::shared_ptr<facebook::react::CallInvoker> jsCallInvoker) {
37a48bc6c0SBrent Vatne   jsCallInvoker_ = jsCallInvoker;
38a48bc6c0SBrent Vatne }
39a48bc6c0SBrent Vatne 
setRuntimeManager(std::shared_ptr<RuntimeManager> runtimeManager)40c7e4709dSKudo Chien void Scheduler::setRuntimeManager(
41c7e4709dSKudo Chien     std::shared_ptr<RuntimeManager> runtimeManager) {
4265c59487SŁukasz Kosmaty   this->runtimeManager = runtimeManager;
43a48bc6c0SBrent Vatne }
44a48bc6c0SBrent Vatne 
~Scheduler()45a48bc6c0SBrent Vatne Scheduler::~Scheduler() {}
46a48bc6c0SBrent Vatne 
Scheduler()47c7e4709dSKudo Chien Scheduler::Scheduler() {
48c7e4709dSKudo Chien   this->scheduledOnUI = false;
49a48bc6c0SBrent Vatne }
50c7e4709dSKudo Chien 
51c7e4709dSKudo Chien } // namespace reanimated
52