aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/shared/Database/DatabaseWorkerPool.cpp15
-rw-r--r--src/server/shared/Database/DatabaseWorkerPool.h16
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