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