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 implementation 21 #include "PTL/TaskRunManager.hh" 22 23 #include "PTL/TaskManager.hh" 24 #include "PTL/ThreadPool.hh" 25 26 namespace PTL 27 { 28 //============================================ 29 30 TaskRunManager::pointer& 31 TaskRunManager::GetPrivateMasterRunManager() 32 { 33 static pointer _instance = nullptr; 34 return _instance; 35 } 36 37 //============================================ 38 39 TaskRunManager::pointer& 40 TaskRunManager::GetPrivateMasterRunManager(boo 41 { 42 auto& _v = GetPrivateMasterRunManager(); 43 if(!init) 44 return _v; 45 if(!_v) 46 _v = new TaskRunManager(useTBB); 47 return _v; 48 } 49 50 //============================================ 51 52 TaskRunManager* 53 TaskRunManager::GetMasterRunManager(bool useTB 54 { 55 auto& _v = GetPrivateMasterRunManager(true 56 return _v; 57 } 58 59 //============================================ 60 61 TaskRunManager* 62 TaskRunManager::GetInstance(bool useTBB) 63 { 64 return GetMasterRunManager(useTBB); 65 } 66 67 //============================================ 68 69 TaskRunManager::TaskRunManager(bool useTBB) 70 : m_workers(std::thread::hardware_concurrency( 71 , m_use_tbb(useTBB) 72 { 73 if(!GetPrivateMasterRunManager()) 74 GetPrivateMasterRunManager() = this; 75 } 76 77 //============================================ 78 79 TaskRunManager::~TaskRunManager() 80 { 81 if(GetPrivateMasterRunManager() == this) 82 GetPrivateMasterRunManager() = nullptr 83 } 84 85 //============================================ 86 87 void 88 TaskRunManager::Initialize(uint64_t n) 89 { 90 m_workers = n; 91 92 // create threadpool if needed + task mana 93 if(!m_thread_pool) 94 { 95 ThreadPool::Config cfg; 96 cfg.pool_size = m_workers; 97 cfg.task_queue = m_task_queue; 98 cfg.use_tbb = m_use_tbb; 99 m_thread_pool = new ThreadPool(cfg); 100 m_task_manager = new TaskManager(m_thr 101 } 102 // or resize 103 else if(m_workers != m_thread_pool->size() 104 { 105 m_thread_pool->resize(m_workers); 106 } 107 108 m_is_initialized = true; 109 } 110 111 //============================================ 112 113 void 114 TaskRunManager::Terminate() 115 { 116 m_is_initialized = false; 117 if(m_thread_pool) 118 m_thread_pool->destroy_threadpool(); 119 delete m_task_manager; 120 delete m_thread_pool; 121 m_task_manager = nullptr; 122 m_thread_pool = nullptr; 123 } 124 125 //============================================ 126 127 } // namespace PTL 128