1*4440fb50SKudo Chien #ifdef __APPLE__
2*4440fb50SKudo Chien #include <RNReanimated/Scheduler.h>
3*4440fb50SKudo Chien #else
4*4440fb50SKudo Chien #include "Scheduler.h"
5*4440fb50SKudo Chien #endif
6*4440fb50SKudo Chien #include "ReanimatedRuntime.h"
7*4440fb50SKudo Chien #include "RuntimeManager.h"
8*4440fb50SKudo Chien 
9*4440fb50SKudo Chien namespace reanimated {
10*4440fb50SKudo Chien 
scheduleOnUI(std::function<void ()> job)11*4440fb50SKudo Chien void Scheduler::scheduleOnUI(std::function<void()> job) {
12*4440fb50SKudo Chien   uiJobs.push(std::move(job));
13*4440fb50SKudo Chien }
14*4440fb50SKudo Chien 
scheduleOnJS(std::function<void ()> job)15*4440fb50SKudo Chien void Scheduler::scheduleOnJS(std::function<void()> job) {
16*4440fb50SKudo Chien   jsCallInvoker_->invokeAsync(std::move(job));
17*4440fb50SKudo Chien }
18*4440fb50SKudo Chien 
triggerUI()19*4440fb50SKudo Chien void Scheduler::triggerUI() {
20*4440fb50SKudo Chien   scheduledOnUI = false;
21*4440fb50SKudo Chien #if JS_RUNTIME_HERMES
22*4440fb50SKudo Chien   // JSI's scope defined here allows for JSI-objects to be cleared up after
23*4440fb50SKudo Chien   // each runtime loop. Within these loops we typically create some temporary
24*4440fb50SKudo Chien   // JSI objects and hence it allows for such objects to be garbage collected
25*4440fb50SKudo Chien   // much sooner.
26*4440fb50SKudo Chien   // Apparently the scope API is only supported on Hermes at the moment.
27*4440fb50SKudo Chien   auto scope = jsi::Scope(*runtimeManager.lock()->runtime);
28*4440fb50SKudo Chien #endif
29*4440fb50SKudo Chien   while (uiJobs.getSize()) {
30*4440fb50SKudo Chien     auto job = uiJobs.pop();
31*4440fb50SKudo Chien     job();
32*4440fb50SKudo Chien   }
33*4440fb50SKudo Chien }
34*4440fb50SKudo Chien 
setJSCallInvoker(std::shared_ptr<facebook::react::CallInvoker> jsCallInvoker)35*4440fb50SKudo Chien void Scheduler::setJSCallInvoker(
36*4440fb50SKudo Chien     std::shared_ptr<facebook::react::CallInvoker> jsCallInvoker) {
37*4440fb50SKudo Chien   jsCallInvoker_ = jsCallInvoker;
38*4440fb50SKudo Chien }
39*4440fb50SKudo Chien 
setRuntimeManager(std::shared_ptr<RuntimeManager> runtimeManager)40*4440fb50SKudo Chien void Scheduler::setRuntimeManager(
41*4440fb50SKudo Chien     std::shared_ptr<RuntimeManager> runtimeManager) {
42*4440fb50SKudo Chien   this->runtimeManager = runtimeManager;
43*4440fb50SKudo Chien }
44*4440fb50SKudo Chien 
~Scheduler()45*4440fb50SKudo Chien Scheduler::~Scheduler() {}
46*4440fb50SKudo Chien 
Scheduler()47*4440fb50SKudo Chien Scheduler::Scheduler() {
48*4440fb50SKudo Chien   this->scheduledOnUI = false;
49*4440fb50SKudo Chien }
50*4440fb50SKudo Chien 
51*4440fb50SKudo Chien } // namespace reanimated
52