//################################################################################################## // // Custom Visualization Core library // Copyright (C) 2011-2013 Ceetron AS // // This library may be used under the terms of either the GNU General Public License or // the GNU Lesser General Public License as follows: // // GNU General Public License Usage // This library is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This library is distributed in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. // // See the GNU General Public License at <> // for more details. // // GNU Lesser General Public License Usage // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 2.1 of the License, or // (at your option) any later version. // // This library is distributed in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. // // See the GNU Lesser General Public License at <> // for more details. // //################################################################################################## #include "cafAsyncWorkerManager.h" //-------------------------------------------------------------------------------------------------- /// Create a static thread manager that is cleared when the program ends. //-------------------------------------------------------------------------------------------------- caf::AsyncWorkerManager& caf::AsyncWorkerManager::instance() { static AsyncWorkerManager manager; return manager; } //-------------------------------------------------------------------------------------------------- /// Destructor waiting for threads to join. //-------------------------------------------------------------------------------------------------- caf::AsyncWorkerManager::~AsyncWorkerManager() { for ( ThreadAndJoinAtExitPair& workerThreadAndJoinFlag : m_threads ) { if ( workerThreadAndJoinFlag.second && workerThreadAndJoinFlag.first.joinable() ) { workerThreadAndJoinFlag.first.join(); } else { workerThreadAndJoinFlag.first.detach(); } } } //-------------------------------------------------------------------------------------------------- /// Takes over ownership of the thread and the caller no longer has access to it. /// A flag can be provided to force the Worker manager to join the threads on exit. /// Set this to true if it is important that the thread finishes before the program exits. //-------------------------------------------------------------------------------------------------- void caf::AsyncWorkerManager::takeThreadOwnership( std::thread& thread, bool joinAtExit ) { m_threads.push_back( std::make_pair( std::move( thread ), joinAtExit ) ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- caf::AsyncWorkerManager::AsyncWorkerManager() { }