/* * ThreadManager.h * * Copyright (C) 2009 Matthias Schiffer * * 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 . */ #ifndef MAD_NET_THREADMANAGER_H_ #define MAD_NET_THREADMANAGER_H_ #include #include #include #include #include #include #include #include namespace Mad { namespace Net { class ThreadManager : public Common::Initializable { private: boost::thread::id mainThreadId; boost::thread *workerThread, *loggerThread, *ioThread; boost::thread_group threads; boost::mutex threadLock; boost::mutex runLock; bool running; boost::mutex workLock; boost::condition_variable workCond; std::queue > work; static ThreadManager threadManager; ThreadManager() {} void workerFunc(); void threadFinished(boost::thread *thread) { threadLock.lock(); threads.remove_thread(thread); threadLock.unlock(); thread->join(); delete thread; } protected: virtual void doInit(); virtual void doDeinit(); public: bool isThisMainThread() { return (mainThreadId == boost::this_thread::get_id()); } bool isThisWorkerThread() { boost::lock_guard lock(threadLock); return (workerThread->get_id() == boost::this_thread::get_id()); } void detach(); void pushWork(const sigc::slot &newWork); static ThreadManager* get() { return &threadManager; } }; } } #endif /* MAD_NET_THREADMANAGER_H_ */