Geant4 Cross Reference |
1 // 2 // MIT License 3 // Copyright (c) 2020 Jonathan R. Madsen 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 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 // The above copyright notice and this permission notice shall be included in 11 // all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED 12 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 13 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 14 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 15 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 16 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 17 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 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(bool init, bool useTBB) 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 useTBB) 54 { 55 auto& _v = GetPrivateMasterRunManager(true, useTBB); 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 manager 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_thread_pool); 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