gearmulator

Emulation of classic VA synths of the late 90s/2000s that are based on Motorola 56300 family DSPs
Log | Files | Refs | Submodules | README | LICENSE

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 }