diff options
Diffstat (limited to 'src/Core/ThreadManager.h')
-rw-r--r-- | src/Core/ThreadManager.h | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/src/Core/ThreadManager.h b/src/Core/ThreadManager.h new file mode 100644 index 0000000..b512ad4 --- /dev/null +++ b/src/Core/ThreadManager.h @@ -0,0 +1,113 @@ +/* + * ThreadManager.h + * + * Copyright (C) 2009 Matthias Schiffer <matthias@gamezock.de> + * + * This program 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 program 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 for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef MAD_CORE_THREADMANAGER_H_ +#define MAD_CORE_THREADMANAGER_H_ + +#include <config.h> + +#include "Initializable.h" + +#include <queue> +#include <map> + +#include <boost/asio.hpp> + +#include <boost/thread/thread.hpp> +#include <boost/thread/condition_variable.hpp> +#include <boost/thread/locks.hpp> + +namespace Mad { +namespace Core { + +class ThreadManager : public Initializable { + private: + boost::thread::id mainThreadId; + boost::shared_ptr<boost::thread> workerThread, loggerThread, ioThread; + std::map<boost::thread::id, boost::shared_ptr<boost::thread> > threads; + + boost::mutex threadLock; + + boost::mutex runLock; + bool running; + + boost::mutex workLock; + boost::condition_variable workCond; + std::queue<boost::function0<void> > work; + + boost::scoped_ptr<boost::asio::io_service::work> ioWorker; + + boost::asio::io_service ioService; + + static ThreadManager threadManager; + + ThreadManager() {} + + void workerFunc(); + void ioFunc(); + + void threadFinished(boost::thread::id threadId) { + boost::shared_ptr<boost::thread> thread; + + { + boost::lock_guard<boost::mutex> lock(threadLock); + + std::map<boost::thread::id, boost::shared_ptr<boost::thread> >::iterator it = threads.find(threadId); + + if(it == threads.end()) + return; + + thread = it->second; + threads.erase(it); + } + + thread->join(); + } + + protected: + virtual void doInit(); + virtual void doDeinit(); + + public: + bool isThisMainThread() { + return (mainThreadId == boost::this_thread::get_id()); + } + + bool isThisWorkerThread() { + boost::lock_guard<boost::mutex> lock(threadLock); + return (workerThread->get_id() == boost::this_thread::get_id()); + } + + boost::asio::io_service& getIOService() { + return ioService; + } + + void detach(); + + void pushWork(const boost::function0<void> &newWork); + + static ThreadManager* get() { + return &threadManager; + } +}; + +} +} + +#endif /* MAD_CORE_THREADMANAGER_H_ */ |