diff options
-rw-r--r-- | src/common/Threading/ThreadPool.h | 48 | ||||
-rw-r--r-- | src/server/worldserver/Main.cpp | 16 |
2 files changed, 54 insertions, 10 deletions
diff --git a/src/common/Threading/ThreadPool.h b/src/common/Threading/ThreadPool.h new file mode 100644 index 00000000000..1606bf98d1e --- /dev/null +++ b/src/common/Threading/ThreadPool.h @@ -0,0 +1,48 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * 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 2 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 TRINITY_THREAD_POOL_H +#define TRINITY_THREAD_POOL_H + +#include <boost/asio/post.hpp> +#include <boost/asio/thread_pool.hpp> +#include <thread> + +namespace Trinity +{ +class ThreadPool +{ +public: + explicit ThreadPool(std::size_t numThreads = std::thread::hardware_concurrency()) : _impl(numThreads) { } + + template<typename T> + decltype(auto) PostWork(T&& work) + { + return boost::asio::post(_impl, std::forward<T>(work)); + } + + void Join() + { + _impl.join(); + } + +private: + boost::asio::thread_pool _impl; +}; +} + +#endif // TRINITY_THREAD_POOL_H diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index 69b226a319a..9bf26b84ef5 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -49,6 +49,7 @@ #include "SecretMgr.h" #include "SharedDefines.h" #include "TCSoap.h" +#include "ThreadPool.h" #include "World.h" #include "WorldSocket.h" #include "WorldSocketMgr.h" @@ -241,20 +242,13 @@ extern int main(int argc, char** argv) // Start the Boost based thread pool int numThreads = sConfigMgr->GetIntDefault("ThreadPool", 1); - std::shared_ptr<std::vector<std::thread>> threadPool(new std::vector<std::thread>(), [ioContext](std::vector<std::thread>* del) - { - ioContext->stop(); - for (std::thread& thr : *del) - thr.join(); - - delete del; - }); - if (numThreads < 1) numThreads = 1; + std::shared_ptr<Trinity::ThreadPool> threadPool = std::make_shared<Trinity::ThreadPool>(numThreads); + for (int i = 0; i < numThreads; ++i) - threadPool->push_back(std::thread([ioContext]() { ioContext->run(); })); + threadPool->PostWork([ioContext]() { ioContext->run(); }); // Set process priority according to configuration settings SetProcessPriority("server.worldserver", sConfigMgr->GetIntDefault(CONFIG_PROCESSOR_AFFINITY, 0), sConfigMgr->GetBoolDefault(CONFIG_HIGH_PRIORITY, false)); @@ -390,6 +384,8 @@ extern int main(int argc, char** argv) WorldUpdateLoop(); // Shutdown starts here + ioContext->stop(); + threadPool.reset(); sLog->SetSynchronous(); |