mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-19 08:55:32 +01:00
- 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:
@@ -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(),
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -40,7 +40,6 @@ m_Mysql(NULL)
|
||||
|
||||
MySQLConnection::~MySQLConnection()
|
||||
{
|
||||
delete m_worker;
|
||||
}
|
||||
|
||||
bool MySQLConnection::Open(const std::string& infoString)
|
||||
|
||||
@@ -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();
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user