From 43048afc7e95e895e8d98ebb242692b456e4e7ca Mon Sep 17 00:00:00 2001 From: Machiavelli Date: Mon, 26 Mar 2012 01:49:41 +0200 Subject: Core/DB Layer: Fix a memory leak. --- src/server/shared/Database/DatabaseWorker.cpp | 7 +++++++ src/server/shared/Database/DatabaseWorkerPool.h | 5 ++--- src/server/shared/Database/MySQLConnection.cpp | 4 ++++ 3 files changed, 13 insertions(+), 3 deletions(-) (limited to 'src/server/shared') diff --git a/src/server/shared/Database/DatabaseWorker.cpp b/src/server/shared/Database/DatabaseWorker.cpp index 662c879ad5e..8dc9ab4669d 100644 --- a/src/server/shared/Database/DatabaseWorker.cpp +++ b/src/server/shared/Database/DatabaseWorker.cpp @@ -34,6 +34,11 @@ int DatabaseWorker::svc() if (!m_queue) return -1; + //! Since this is called from the worker thread itself, we can ensure + //! that thread-specific variables remain in this thread. + if (!m_conn->Open()) + return -1; + SQLOperation *request = NULL; while (1) { @@ -47,5 +52,7 @@ int DatabaseWorker::svc() delete request; } + //! Clean up thread-specific variables + m_conn->Close(); return 0; } diff --git a/src/server/shared/Database/DatabaseWorkerPool.h b/src/server/shared/Database/DatabaseWorkerPool.h index 01b79c9ac58..811db775004 100755 --- a/src/server/shared/Database/DatabaseWorkerPool.h +++ b/src/server/shared/Database/DatabaseWorkerPool.h @@ -53,7 +53,7 @@ class DatabaseWorkerPool public: /* Activity state */ DatabaseWorkerPool() : - m_queue(new ACE_Activation_Queue(new ACE_Message_Queue)) + m_queue(new ACE_Activation_Queue()) { memset(m_connectionCount, 0, sizeof(m_connectionCount)); m_connections.resize(IDX_SIZE); @@ -77,7 +77,6 @@ class DatabaseWorkerPool for (uint8 i = 0; i < async_threads; ++i) { T* t = new T(m_queue, m_connectionInfo); - res &= t->Open(); m_connections[IDX_ASYNC][i] = t; ++m_connectionCount[IDX_ASYNC]; } @@ -111,7 +110,6 @@ class DatabaseWorkerPool DatabaseWorker* worker = t->m_worker; worker->wait(); delete worker; - t->Close(); } sLog->outSQLDriver("Asynchronous connections on databasepool '%s' terminated. Proceeding with synchronous connections.", m_connectionInfo.database.c_str()); @@ -125,6 +123,7 @@ class DatabaseWorkerPool t->Close(); } + delete m_queue; sLog->outSQLDriver("All connections on databasepool %s closed.", m_connectionInfo.database.c_str()); } diff --git a/src/server/shared/Database/MySQLConnection.cpp b/src/server/shared/Database/MySQLConnection.cpp index f686db4c199..273d2842505 100755 --- a/src/server/shared/Database/MySQLConnection.cpp +++ b/src/server/shared/Database/MySQLConnection.cpp @@ -68,9 +68,13 @@ MySQLConnection::~MySQLConnection() } mysql_close(m_Mysql); + MySQL::Thread_End(); Unlock(); /// Unlock while we die, how ironic } +//! Can be called synchronously in DatabaseWorkerPool, in which thread-specific variables initialized in the main thread +//! are deallocated. +//! Can also be called by worker threads, in which their respective thread-specific variables are deallocated. void MySQLConnection::Close() { /// Only close us if we're not operating -- cgit v1.2.3