diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/shared/Database/DatabaseWorkerPool.cpp | 15 | ||||
-rw-r--r-- | src/server/shared/Database/DatabaseWorkerPool.h | 16 |
2 files changed, 19 insertions, 12 deletions
diff --git a/src/server/shared/Database/DatabaseWorkerPool.cpp b/src/server/shared/Database/DatabaseWorkerPool.cpp index 40efc32ac04..5be47102e34 100644 --- a/src/server/shared/Database/DatabaseWorkerPool.cpp +++ b/src/server/shared/Database/DatabaseWorkerPool.cpp @@ -60,9 +60,12 @@ bool DatabaseWorkerPool::Open(const std::string& infoString, uint8 num_threads) void DatabaseWorkerPool::Close() { /// Shuts down worker threads for this connection pool. + ACE_Thread_Mutex shutdown_Mtx; + ACE_Condition_Thread_Mutex m_condition(shutdown_Mtx); for (uint8 i = 0; i < m_async_connections.size(); i++) { - Enqueue(new DatabaseWorkerPoolEnd()); + Enqueue(new DatabaseWorkerPoolEnd(m_condition)); + m_condition.wait(); } m_queue->queue()->deactivate(); @@ -71,7 +74,11 @@ void DatabaseWorkerPool::Close() m_bundle_conn = NULL; //- MySQL::Thread_End() should be called manually from the aborting calling threads - ASSERT( m_sync_connections.empty() ); + DEBUG_LOG("Waiting for synchroneous database threads to exit."); + while (!m_sync_connections.empty()) + { + } + DEBUG_LOG("Synchroneous database threads exited succesfuly."); } /*! This function creates a new MySQL connection for every MapUpdate thread @@ -96,7 +103,9 @@ void DatabaseWorkerPool::End_MySQL_Connection() MySQLConnection* conn; { ACE_Guard<ACE_Thread_Mutex> guard(m_connectionMap_mtx); - conn = m_sync_connections[ACE_Based::Thread::current()]; + ConnectionMap::iterator itr = m_sync_connections.find(ACE_Based::Thread::current()); + conn = itr->second; + m_sync_connections.erase(itr); } delete conn; conn = NULL; diff --git a/src/server/shared/Database/DatabaseWorkerPool.h b/src/server/shared/Database/DatabaseWorkerPool.h index b7d2feb1eef..6443d05b0dd 100644 --- a/src/server/shared/Database/DatabaseWorkerPool.h +++ b/src/server/shared/Database/DatabaseWorkerPool.h @@ -42,15 +42,13 @@ enum MySQLThreadBundle class DatabaseWorkerPoolEnd : public SQLOperation { public: - //- This deletion will shut down the worker thread - int call() - { - return -1; - } - bool Execute() - { - return false; - } + DatabaseWorkerPoolEnd(ACE_Condition_Thread_Mutex &mtx) : shutdown_Mtx(mtx) {} + ~DatabaseWorkerPoolEnd() { shutdown_Mtx.broadcast(); } //! Tells the Worker Pool to enqueue the next DatabaseWorkerPoolEnd operation. + + int call() { return -1; } + bool Execute() { return false;} //! Not called - fool the compiler + + ACE_Condition_Thread_Mutex &shutdown_Mtx; }; class DatabaseWorkerPool |