1 /* 2 * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. 3 4 * Permission is hereby granted, free of charge, to any person obtaining a copy 5 * of this software and associated documentation files (the "Software"), to deal 6 * in the Software without restriction, including without limitation the rights 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 * copies of the Software, and to permit persons to whom the Software is 9 * furnished to do so, subject to the following conditions: 10 11 * The above copyright notice and this permission notice shall be included in all 12 * copies or substantial portions of the Software. 13 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 * SOFTWARE. 21 */ 22 23 #include "../../lv_conf_internal.h" 24 #if LV_USE_THORVG_INTERNAL 25 26 #ifndef _TVG_TASK_SCHEDULER_H_ 27 #define _TVG_TASK_SCHEDULER_H_ 28 29 #include <mutex> 30 #include <condition_variable> 31 32 #include "tvgCommon.h" 33 #include "tvgInlist.h" 34 35 namespace tvg { 36 37 #ifdef THORVG_THREAD_SUPPORT 38 39 struct Task 40 { 41 private: 42 mutex mtx; 43 condition_variable cv; 44 bool ready = true; 45 bool pending = false; 46 47 public: 48 INLIST_ITEM(Task); 49 50 virtual ~Task() = default; 51 doneTask52 void done() 53 { 54 if (!pending) return; 55 56 unique_lock<mutex> lock(mtx); 57 while (!ready) cv.wait(lock); 58 pending = false; 59 } 60 61 protected: 62 virtual void run(unsigned tid) = 0; 63 64 private: operatorTask65 void operator()(unsigned tid) 66 { 67 run(tid); 68 69 lock_guard<mutex> lock(mtx); 70 ready = true; 71 cv.notify_one(); 72 } 73 prepareTask74 void prepare() 75 { 76 ready = false; 77 pending = true; 78 } 79 80 friend struct TaskSchedulerImpl; 81 }; 82 83 #else //THORVG_THREAD_SUPPORT 84 85 struct Task 86 { 87 public: 88 INLIST_ITEM(Task); 89 90 virtual ~Task() = default; 91 void done() {} 92 93 protected: 94 virtual void run(unsigned tid) = 0; 95 96 private: 97 friend struct TaskSchedulerImpl; 98 }; 99 100 #endif //THORVG_THREAD_SUPPORT 101 102 103 struct TaskScheduler 104 { 105 static uint32_t threads(); 106 static void init(uint32_t threads); 107 static void term(); 108 static void request(Task* task); 109 static void async(bool on); 110 }; 111 112 } //namespace 113 114 #endif //_TVG_TASK_SCHEDULER_H_ 115 116 117 #endif /* LV_USE_THORVG_INTERNAL */ 118 119