jobqueue.h (2011B)
1 #pragma once 2 3 #include <deque> 4 #include <functional> 5 #include <mutex> 6 #include <condition_variable> 7 #include <thread> 8 #include <vector> 9 #include <memory> 10 11 #include "dsp56kEmu/threadtools.h" 12 13 namespace pluginLib::patchDB 14 { 15 class JobGroup; 16 17 class JobQueue final 18 { 19 public: 20 JobQueue(std::string _name = {}, bool _start = true, const dsp56k::ThreadPriority& _prio = dsp56k::ThreadPriority::Normal, uint32_t _threadCount = 1); 21 ~JobQueue(); 22 23 JobQueue(JobQueue&&) = delete; 24 JobQueue(const JobQueue&) = delete; 25 JobQueue& operator = (const JobQueue&) = delete; 26 JobQueue& operator = (JobQueue&&) = delete; 27 28 void start(); 29 void destroy(); 30 31 void add(std::function<void()>&& _func); 32 bool destroyed() const { return m_destroy; } 33 34 size_t size() const; 35 bool empty() const { return size() == 0; } 36 void waitEmpty(); 37 size_t pending() const; 38 39 private: 40 void threadFunc(); 41 42 std::string m_name; 43 dsp56k::ThreadPriority m_threadPriority; 44 uint32_t m_threadCount; 45 46 std::deque<std::function<void()>> m_funcs; 47 mutable std::mutex m_mutexFuncs; 48 std::condition_variable m_cv; 49 50 std::condition_variable m_emptyCv; 51 52 bool m_destroy = false; 53 uint32_t m_numRunning = 0; 54 55 std::vector<std::unique_ptr<std::thread>> m_threads; 56 }; 57 58 class JobGroup final 59 { 60 public: 61 explicit JobGroup(JobQueue& _queue); 62 63 JobGroup(JobGroup&&) = delete; 64 JobGroup(const JobGroup&) = delete; 65 JobGroup& operator = (const JobGroup&) = delete; 66 JobGroup& operator = (JobGroup&&) = delete; 67 68 ~JobGroup(); 69 70 void add(std::function<void()>&&); 71 72 template<typename T> 73 void forEach(const T& _container, const std::function<void(const T&)>& _func, bool _wait = true) 74 { 75 for (const auto& e : _container) 76 { 77 add([&e, &_func] 78 { 79 _func(e); 80 }); 81 } 82 83 if (_wait) 84 wait(); 85 } 86 87 void wait(); 88 89 private: 90 void onFuncCompleted(); 91 92 JobQueue& m_queue; 93 94 std::mutex m_mutexCounts; 95 uint32_t m_countEnqueued = 0; 96 uint32_t m_countCompleted = 0; 97 98 std::condition_variable m_completedCv; 99 }; 100 }