mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-23 10:26:28 +01:00
Use ´manual´ ACE_Thread_Mutex objects in SQLTransaction class instead of using ACE_Based::LockedQueue.
This will either result in a crash fix caused by underlying operations of ACE_Based::LockedQueue, or at least give us a clearer view at where the crash is coming from. --HG-- branch : trunk
This commit is contained in:
@@ -35,35 +35,38 @@ void SqlTransaction::Execute(Database *db)
|
||||
{
|
||||
const char* sql;
|
||||
|
||||
m_Mutex.acquire();
|
||||
if (m_queue.empty())
|
||||
{
|
||||
m_Mutex.release();
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
db->DirectExecute("START TRANSACTION");
|
||||
while (!m_queue.empty())
|
||||
{
|
||||
sql = m_queue.peek();
|
||||
m_queue.unlock();
|
||||
sql = m_queue.front();
|
||||
|
||||
if (!db->DirectExecute(sql))
|
||||
{
|
||||
free((void*)const_cast<char*>(sql));
|
||||
m_queue.pop_front();
|
||||
m_queue.pop();
|
||||
db->DirectExecute("ROLLBACK");
|
||||
while (!m_queue.empty())
|
||||
{
|
||||
sql = m_queue.peek();
|
||||
m_queue.unlock();
|
||||
free((void*)const_cast<char*>(sql));
|
||||
m_queue.pop_front();
|
||||
free((void*)const_cast<char*>(m_queue.front()));
|
||||
m_queue.pop();
|
||||
}
|
||||
|
||||
m_Mutex.release();
|
||||
return;
|
||||
}
|
||||
|
||||
free((void*)const_cast<char*>(sql));
|
||||
m_queue.pop_front();
|
||||
m_queue.pop();
|
||||
}
|
||||
|
||||
db->DirectExecute("COMMIT");
|
||||
m_Mutex.release();
|
||||
}
|
||||
|
||||
/// ---- ASYNC QUERIES ----
|
||||
|
||||
@@ -57,12 +57,19 @@ class SqlStatement : public SqlOperation
|
||||
|
||||
class SqlTransaction : public SqlOperation
|
||||
{
|
||||
typedef ACE_Based::LockedQueue<const char *, ACE_Thread_Mutex> LockedQueue;
|
||||
private:
|
||||
LockedQueue m_queue;
|
||||
std::queue<const char*> m_queue;
|
||||
ACE_Thread_Mutex m_Mutex;
|
||||
public:
|
||||
SqlTransaction() {}
|
||||
void DelayExecute(const char *sql) { m_queue.add(strdup(sql)); }
|
||||
void DelayExecute(const char *sql)
|
||||
{
|
||||
m_Mutex.acquire();
|
||||
char* _sql = strdup(sql);
|
||||
if (_sql)
|
||||
m_queue.push(_sql);
|
||||
m_Mutex.release();
|
||||
}
|
||||
void Execute(Database *db);
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user