diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-09-19 13:38:49 +0200 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2024-09-21 05:50:20 +0200 |
commit | 3cde0837450ee8cef4df4553cb0e1753b8b5a077 (patch) | |
tree | d0554c41f6acbdcda8bb03e6e97d05467025a0cb /src/server/database/Database/MySQLConnection.cpp | |
parent | 249d1372bb5e1f0729324d7b0e4629eb05db388b (diff) |
Core/Database: Change database async thread shutdown to fix some corner cases leading to servers being stuck on shutdown (for example with exit() call)
(cherry picked from commit 11a832fa8ba2362a0efcde601e7225582326e0da)
Diffstat (limited to 'src/server/database/Database/MySQLConnection.cpp')
-rw-r--r-- | src/server/database/Database/MySQLConnection.cpp | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/src/server/database/Database/MySQLConnection.cpp b/src/server/database/Database/MySQLConnection.cpp index 7efe93c34f7..3437fc55b1d 100644 --- a/src/server/database/Database/MySQLConnection.cpp +++ b/src/server/database/Database/MySQLConnection.cpp @@ -47,6 +47,12 @@ MySQLConnectionInfo::MySQLConnectionInfo(std::string const& infoString) ssl.assign(tokens[5]); } +struct MySQLConnection::WorkerThread +{ + std::thread ThreadHandle; + boost::asio::executor_work_guard<Trinity::Asio::IoContext::Executor> WorkGuard; +}; + MySQLConnection::MySQLConnection(MySQLConnectionInfo& connInfo, ConnectionFlags connectionFlags) : m_reconnecting(false), m_prepareError(false), @@ -66,7 +72,8 @@ void MySQLConnection::Close() // Stop the worker thread before the statements are cleared if (m_workerThread) { - m_workerThread->join(); + m_workerThread->WorkGuard.reset(); + m_workerThread->ThreadHandle.join(); m_workerThread.reset(); } @@ -444,18 +451,18 @@ uint32 MySQLConnection::GetLastError() void MySQLConnection::StartWorkerThread(Trinity::Asio::IoContext* context) { - m_workerThread = std::make_unique<std::thread>([context] - { - boost::asio::executor_work_guard executorWorkGuard = boost::asio::make_work_guard(context->get_executor()); + boost::asio::executor_work_guard executorWorkGuard = boost::asio::make_work_guard(context->get_executor()); // construct guard before thread starts running - context->run(); + m_workerThread = std::make_unique<WorkerThread>(WorkerThread{ + .ThreadHandle = std::thread([context] { context->run(); }), + .WorkGuard = std::move(executorWorkGuard) }); } std::thread::id MySQLConnection::GetWorkerThreadId() const { if (m_workerThread) - return m_workerThread->get_id(); + return m_workerThread->ThreadHandle.get_id(); return {}; } |