1 #pragma once
2 
3 #include <ReactCommon/CallInvoker.h>
4 #include <condition_variable>
5 #include <functional>
6 #include <memory>
7 #include <mutex>
8 #include <queue>
9 #include <thread>
10 #include <utility>
11 
12 namespace reanimated {
13 
14 //
15 // Copyright (c) 2013 Juan Palacios [email protected]
16 // Subject to the BSD 2-Clause License
17 // - see < http://opensource.org/licenses/BSD-2-Clause>
18 //
19 template <typename T>
20 class Queue {
21  public:
pop()22   T pop() {
23     std::unique_lock<std::mutex> mlock(mutex_);
24     while (queue_.empty()) {
25       cond_.wait(mlock);
26     }
27     auto item = queue_.front();
28     queue_.pop();
29     return item;
30   }
31 
pop(T & item)32   void pop(T &item) {
33     std::unique_lock<std::mutex> mlock(mutex_);
34     while (queue_.empty()) {
35       cond_.wait(mlock);
36     }
37     item = queue_.front();
38     queue_.pop();
39   }
40 
push(const T & item)41   void push(const T &item) {
42     std::unique_lock<std::mutex> mlock(mutex_);
43     queue_.push(item);
44     mlock.unlock();
45     cond_.notify_one();
46   }
47 
push(T && item)48   void push(T &&item) {
49     std::unique_lock<std::mutex> mlock(mutex_);
50     queue_.push(std::move(item));
51     mlock.unlock();
52     cond_.notify_one();
53   }
54 
getSize()55   size_t getSize() {
56     std::unique_lock<std::mutex> mlock(mutex_);
57     const size_t res = queue_.size();
58     mlock.unlock();
59     cond_.notify_one();
60     return res;
61   }
62 
63  private:
64   std::queue<T> queue_;
65   std::mutex mutex_;
66   std::condition_variable cond_;
67 };
68 
69 class RuntimeManager;
70 
71 class Scheduler {
72  public:
73   Scheduler();
74   void scheduleOnJS(std::function<void()> job);
75   void setJSCallInvoker(
76       std::shared_ptr<facebook::react::CallInvoker> jsCallInvoker);
77   void setRuntimeManager(std::shared_ptr<RuntimeManager> runtimeManager);
78   virtual void scheduleOnUI(std::function<void()> job);
79   virtual void triggerUI();
80   virtual ~Scheduler();
81 
82  protected:
83   std::atomic<bool> scheduledOnUI{};
84   Queue<std::function<void()>> uiJobs;
85   std::shared_ptr<facebook::react::CallInvoker> jsCallInvoker_;
86   std::weak_ptr<RuntimeManager> runtimeManager;
87 };
88 
89 } // namespace reanimated
90