Geant4 Cross Reference |
1 // 1 2 // MIT License 3 // Copyright (c) 2020 Jonathan R. Madsen 4 // Permission is hereby granted, free of charg 5 // of this software and associated documentati 6 // in the Software without restriction, includ 7 // to use, copy, modify, merge, publish, distr 8 // copies of the Software, and to permit perso 9 // furnished to do so, subject to the followin 10 // The above copyright notice and this permiss 11 // all copies or substantial portions of the S 12 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPR 13 // LIMITED TO THE WARRANTIES OF MERCHANTABILIT 14 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SH 15 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 16 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARIS 17 // WITH THE SOFTWARE OR THE USE OR OTHER DEALI 18 // 19 // ------------------------------------------ 20 // Tasking class header 21 // Class Description: 22 // Abstract base class for creating a tas 23 // ThreadPool 24 // ------------------------------------------ 25 // Author: Jonathan Madsen 26 // ------------------------------------------ 27 28 #pragma once 29 30 #include "PTL/Macros.hh" 31 #include "PTL/Types.hh" 32 33 #include <atomic> 34 #include <cstdint> 35 #include <functional> 36 #include <memory> 37 #include <set> 38 39 namespace PTL 40 { 41 class VTask; 42 class ThreadPool; 43 class ThreadData; 44 45 class VUserTaskQueue 46 { 47 public: 48 using task_pointer = std::shared_ptr<VTas 49 using AtomicInt = std::atomic<intmax_t 50 using size_type = uintmax_t; 51 using function_type = std::function<void() 52 using ThreadIdSet = std::set<ThreadId>; 53 54 public: 55 // Constructor - accepting the number of w 56 explicit VUserTaskQueue(intmax_t nworkers 57 // Virtual destructors are required by abs 58 // so add it by default, just in case 59 virtual ~VUserTaskQueue() = default; 60 61 public: 62 // Virtual function for getting a task fro 63 // parameters: 64 // 1. int - get from specific sub-que 65 // 2. int - number of iterations 66 // returns: 67 // VTask* - a task or nullptr 68 virtual task_pointer GetTask(intmax_t subq 69 70 // Virtual function for inserting a task i 71 // parameters: 72 // 1. VTask* - task to insert 73 // 2. int - sub-queue to inserting in 74 // return: 75 // int - subqueue inserted into 76 virtual intmax_t InsertTask(task_pointer&& 77 intmax_t subq 78 79 // Overload this function to hold threads 80 virtual void Wait() = 0; 81 virtual intmax_t GetThreadBin() const = 0; 82 83 virtual void resize(intmax_t) = 0; 84 85 // these are used for stanard checking 86 virtual size_type size() const = 0; 87 virtual bool empty() const = 0; 88 89 virtual size_type bin_size(size_type bin) 90 virtual bool bin_empty(size_type bin) 91 92 // these are for slower checking, default 93 virtual size_type true_size() const { retu 94 virtual bool true_empty() const { ret 95 96 // a method of executing a specific functi 97 virtual void ExecuteOnAllThreads(ThreadPoo 98 99 virtual void ExecuteOnSpecificThreads(Thre 100 func 101 102 intmax_t workers() const { return m_worker 103 104 virtual VUserTaskQueue* clone() = 0; 105 106 protected: 107 intmax_t m_workers = 0; 108 }; 109 110 } // namespace PTL 111