aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMachiavelli <none@none>2010-05-13 17:24:54 +0200
committerMachiavelli <none@none>2010-05-13 17:24:54 +0200
commit144a1468108c553f7f92f2d72511baadea0c7c28 (patch)
treef08ba886f7d9229dc2955ffb4aaee076a244ef6f /src
parent28bbc233d11f16424d3bb65b95e80d6d75353456 (diff)
Fix crash introduced in 4610bbf047.
- Update SqlAsyncTask´s destructor, properly NULLpoint SqlOperation* m_op so other threads can deal with it accordingly. - Don´t keep NULL´d elements in transaction queues, remove them instead. This now means you should be able to run a stable server with > 2 MapUpdate threads. Please leave feedback. Courtesy of click and myself. --HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/shared/Database/Database.cpp2
-rw-r--r--src/shared/Database/SqlOperations.h17
2 files changed, 14 insertions, 5 deletions
diff --git a/src/shared/Database/Database.cpp b/src/shared/Database/Database.cpp
index d03f8704896..40ab58fa621 100644
--- a/src/shared/Database/Database.cpp
+++ b/src/shared/Database/Database.cpp
@@ -591,6 +591,7 @@ bool Database::CommitTransaction()
if (i != m_tranQueues.end() && i->second != NULL)
{
m_threadBody->Delay(i->second);
+ m_tranQueues.erase(i);
return true;
}
else
@@ -620,6 +621,7 @@ bool Database::RollbackTransaction()
{
delete i->second;
i->second = NULL;
+ m_tranQueues.erase(i);
}
return true;
diff --git a/src/shared/Database/SqlOperations.h b/src/shared/Database/SqlOperations.h
index d450a816c4e..0a54af70ffb 100644
--- a/src/shared/Database/SqlOperations.h
+++ b/src/shared/Database/SqlOperations.h
@@ -125,21 +125,28 @@ class SqlQueryHolderEx : public SqlOperation
class SqlAsyncTask : public ACE_Method_Request
{
public:
- SqlAsyncTask(Database * db, SqlOperation * op) : m_db(db), m_op(op) {}
- ~SqlAsyncTask() { if(!m_op) return; delete m_op; }
+ SqlAsyncTask(Database * db, SqlOperation * op) : m_db(db), m_op(op){}
+ ~SqlAsyncTask()
+ {
+ if (!m_op)
+ return;
+
+ delete m_op;
+ m_op = NULL;
+ }
int call()
{
- if(m_db == NULL || m_op == NULL)
+ if (m_db == NULL || m_op == NULL)
return -1;
try
{
- m_op->Execute(m_db);
+ m_op->Execute(m_db);
}
catch(...)
{
- return -1;
+ return -1;
}
return 0;