- 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
This commit is contained in:
Machiavelli
2010-08-19 00:13:09 +02:00
parent fb9c6c96c7
commit 3932fc8c83
9 changed files with 38 additions and 23 deletions

View File

@@ -60,7 +60,7 @@ void WorldSession::SendNameQueryOpcode(Player *p)
void WorldSession::SendNameQueryOpcodeFromDB(uint64 guid)
{
m_nameQueryCallbacks.insert(
ACE_Future<QueryResult_AutoPtr> lFutureResult =
CharacterDatabase.AsyncPQuery(
!sWorld.getConfig(CONFIG_DECLINED_NAMES_USED) ?
// ------- Query Without Declined Names --------
@@ -74,9 +74,11 @@ void WorldSession::SendNameQueryOpcodeFromDB(uint64 guid)
// 5 6 7 8 9
"genitive, dative, accusative, instrumental, prepositional "
"FROM characters LEFT JOIN character_declinedname ON characters.guid = character_declinedname.guid WHERE characters.guid = '%u'",
GUID_LOPART(guid))
GUID_LOPART(guid)
);
m_nameQueryCallbacks.insert(lFutureResult);
// CharacterDatabase.AsyncPQuery(&WorldSession::SendNameQueryOpcodeFromDBCallBack, GetAccountId(),
}

View File

@@ -994,7 +994,7 @@ void WorldSession::ProcessQueryCallbacks()
//! HandleAddFriendOpcode
if (m_addFriendCallback.IsReady())
{
std::string& param = m_addFriendCallback.GetParam();
const std::string& param = m_addFriendCallback.GetParam();
m_addFriendCallback.GetResult(result);
HandleAddFriendOpcodeCallBack(result, param);
m_addFriendCallback.FreeResult();
@@ -1003,7 +1003,7 @@ void WorldSession::ProcessQueryCallbacks()
//- HandleCharRenameOpcode
if (m_charRenameCallback.IsReady())
{
std::string& param = m_charRenameCallback.GetParam();
const std::string& param = m_charRenameCallback.GetParam();
m_charRenameCallback.GetResult(result);
HandleChangePlayerNameOpcodeCallBack(result, param);
m_charRenameCallback.FreeResult();

View File

@@ -802,7 +802,7 @@ class WorldSession
private:
void ProcessQueryCallbacks();
QueryResultFutureSet m_nameQueryCallbacks;
ACE_Future_Set<QueryResult_AutoPtr> m_nameQueryCallbacks;
QueryResultFuture m_charEnumCallback;
QueryResultFuture m_addIgnoreCallback;
QueryCallback<std::string> m_charRenameCallback;

View File

@@ -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;
}

View File

@@ -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];

View File

@@ -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();

View File

@@ -40,7 +40,6 @@ m_Mysql(NULL)
MySQLConnection::~MySQLConnection()
{
delete m_worker;
}
bool MySQLConnection::Open(const std::string& infoString)

View File

@@ -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();
};

View File

@@ -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