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:
Machiavelli
2010-05-26 19:19:06 +02:00
parent 6da6879eff
commit 7c0f140bb0
2 changed files with 23 additions and 13 deletions

View File

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

View File

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