aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared
diff options
context:
space:
mode:
authorMachiavelli <none@none>2010-08-19 00:13:09 +0200
committerMachiavelli <none@none>2010-08-19 00:13:09 +0200
commit3932fc8c83f10c75ec4ea7a671218975de79a85c (patch)
tree553860faaa89d9d883d5253bc0962a3294051468 /src/server/shared
parentfb9c6c96c73a12f261cfde3743337e83692ea426 (diff)
- Fix Linux build (huge thanks to Aokromes for testing as always)
- Some work towards resolving the crash on shutdown by implementing a shutdown task --HG-- branch : trunk
Diffstat (limited to 'src/server/shared')
-rw-r--r--src/server/shared/Database/DatabaseWorker.cpp7
-rw-r--r--src/server/shared/Database/DatabaseWorkerPool.cpp15
-rw-r--r--src/server/shared/Database/DatabaseWorkerPool.h18
-rw-r--r--src/server/shared/Database/MySQLConnection.cpp1
-rw-r--r--src/server/shared/Database/SQLOperation.h4
-rw-r--r--src/server/shared/Threading/Callback.h4
6 files changed, 31 insertions, 18 deletions
diff --git a/src/server/shared/Database/DatabaseWorker.cpp b/src/server/shared/Database/DatabaseWorker.cpp
index 17fc1d75a5d..e5e53471b76 100644
--- a/src/server/shared/Database/DatabaseWorker.cpp
+++ b/src/server/shared/Database/DatabaseWorker.cpp
@@ -38,16 +38,15 @@ int DatabaseWorker::svc()
while (1)
{
request = (SQLOperation*)(m_queue->dequeue());
- if (!request)
+ request->SetConnection(m_conn);
+ if (request->call() == -1)
break;
- request->SetConnection(m_conn);
- request->call();
delete request;
}
+ delete request;
delete m_conn;
- delete this;
return 0;
}
diff --git a/src/server/shared/Database/DatabaseWorkerPool.cpp b/src/server/shared/Database/DatabaseWorkerPool.cpp
index 2e50f6bf8fa..40efc32ac04 100644
--- a/src/server/shared/Database/DatabaseWorkerPool.cpp
+++ b/src/server/shared/Database/DatabaseWorkerPool.cpp
@@ -61,12 +61,17 @@ void DatabaseWorkerPool::Close()
{
/// Shuts down worker threads for this connection pool.
for (uint8 i = 0; i < m_async_connections.size(); i++)
- Enqueue(NULL);
-
- //- MySQL::Thread_End() should be called manually from the aborting calling threads
+ {
+ Enqueue(new DatabaseWorkerPoolEnd());
+ }
+
+ m_queue->queue()->deactivate();
delete m_bundle_conn;
m_bundle_conn = NULL;
+
+ //- MySQL::Thread_End() should be called manually from the aborting calling threads
+ ASSERT( m_sync_connections.empty() );
}
/*! This function creates a new MySQL connection for every MapUpdate thread
@@ -197,7 +202,7 @@ void DatabaseWorkerPool::CommitTransaction()
}
}
-QueryResultFuture DatabaseWorkerPool::AsyncQuery(const char* sql)
+ACE_Future<QueryResult_AutoPtr> DatabaseWorkerPool::AsyncQuery(const char* sql)
{
QueryResultFuture res;
BasicStatementTask* task = new BasicStatementTask(sql, res);
@@ -205,7 +210,7 @@ QueryResultFuture DatabaseWorkerPool::AsyncQuery(const char* sql)
return res; //! Fool compiler, has no use yet
}
-QueryResultFuture DatabaseWorkerPool::AsyncPQuery(const char* sql, ...)
+ACE_Future<QueryResult_AutoPtr> DatabaseWorkerPool::AsyncPQuery(const char* sql, ...)
{
va_list ap;
char szQuery[MAX_QUERY_LEN];
diff --git a/src/server/shared/Database/DatabaseWorkerPool.h b/src/server/shared/Database/DatabaseWorkerPool.h
index c1c645e088e..b7d2feb1eef 100644
--- a/src/server/shared/Database/DatabaseWorkerPool.h
+++ b/src/server/shared/Database/DatabaseWorkerPool.h
@@ -39,6 +39,20 @@ enum MySQLThreadBundle
MYSQL_BUNDLE_ALL = MYSQL_BUNDLE_CLI | MYSQL_BUNDLE_RA | MYSQL_BUNDLE_RAR | MYSQL_BUNDLE_WORLD,
};
+class DatabaseWorkerPoolEnd : public SQLOperation
+{
+ public:
+ //- This deletion will shut down the worker thread
+ int call()
+ {
+ return -1;
+ }
+ bool Execute()
+ {
+ return false;
+ }
+};
+
class DatabaseWorkerPool
{
public:
@@ -57,8 +71,8 @@ class DatabaseWorkerPool
void DirectPExecute(const char* sql, ...);
QueryResult_AutoPtr Query(const char* sql);
QueryResult_AutoPtr PQuery(const char* sql, ...);
- QueryResultFuture AsyncQuery(const char* sql);
- QueryResultFuture AsyncPQuery(const char* sql, ...);
+ ACE_Future<QueryResult_AutoPtr> AsyncQuery(const char* sql);
+ ACE_Future<QueryResult_AutoPtr> AsyncPQuery(const char* sql, ...);
QueryResultHolderFuture DelayQueryHolder(SQLQueryHolder* holder);
void BeginTransaction();
diff --git a/src/server/shared/Database/MySQLConnection.cpp b/src/server/shared/Database/MySQLConnection.cpp
index 24dcb166d49..24573b80d74 100644
--- a/src/server/shared/Database/MySQLConnection.cpp
+++ b/src/server/shared/Database/MySQLConnection.cpp
@@ -40,7 +40,6 @@ m_Mysql(NULL)
MySQLConnection::~MySQLConnection()
{
- delete m_worker;
}
bool MySQLConnection::Open(const std::string& infoString)
diff --git a/src/server/shared/Database/SQLOperation.h b/src/server/shared/Database/SQLOperation.h
index 0bf08d3e3eb..a8238802e31 100644
--- a/src/server/shared/Database/SQLOperation.h
+++ b/src/server/shared/Database/SQLOperation.h
@@ -31,13 +31,12 @@ class SQLOperation : public ACE_Method_Request
{
public:
SQLOperation(){};
- int call()
+ virtual int call()
{
Execute();
return 0;
}
virtual bool Execute() = 0;
-
virtual void SetConnection(MySQLConnection* con) { m_conn = con; }
MySQLConnection* m_conn;
@@ -102,6 +101,7 @@ class SQLQueryHolderTask : public SQLOperation
SQLQueryHolderTask(SQLQueryHolder *holder, QueryResultHolderFuture res)
: m_holder(holder), m_result(res){};
bool Execute();
+
};
diff --git a/src/server/shared/Threading/Callback.h b/src/server/shared/Threading/Callback.h
index e016bbfa0d8..e2f3fcfc8ce 100644
--- a/src/server/shared/Threading/Callback.h
+++ b/src/server/shared/Threading/Callback.h
@@ -76,8 +76,4 @@ class QueryCallback
ParamType param;
};
-/*! ACE_Future_Set to store a bunch of unique async queries with callbacks.
- (ie name queries)
-*/
-typedef ACE_Future_Set<QueryResultFuture> QueryResultFutureSet;
#endif \ No newline at end of file