Reimplement ACE_Based::LockedQueue as SQL holder for the SqlTransaction class, since std::queue is not safe when multiple threads are reading/writing to it at the same time (SqlDelayThread and a MapUpdate Thread).

Original patch by thenecromancer, was removed for ungrounded reasons.
Thanks to Zor for the insight.
Please give feedback on how this affects mtmaps usage.

--HG--
branch : trunk
This commit is contained in:
Machiavelli
2010-05-15 14:58:16 +02:00
parent 7ff9e82f1a
commit fa57ce4cd1
2 changed files with 7 additions and 11 deletions

View File

@@ -33,23 +33,18 @@ void SqlStatement::Execute(Database *db)
void SqlTransaction::Execute(Database *db)
{
if (m_queue.empty())
return;
const char* sql;
db->DirectExecute("START TRANSACTION");
while (!m_queue.empty())
while (m_queue.next(sql))
{
char const *sql = m_queue.front();
m_queue.pop();
if (!db->DirectExecute(sql))
{
free((void*)const_cast<char*>(sql));
db->DirectExecute("ROLLBACK");
while (!m_queue.empty())
while (m_queue.next(sql))
{
free((void*)const_cast<char*>(m_queue.front()));
m_queue.pop();
free((void*)const_cast<char*>(sql));
}
return;
}