From 7c0f140bb063e587baa4ca58aa0a2c77eff6a91f Mon Sep 17 00:00:00 2001 From: Machiavelli Date: Wed, 26 May 2010 19:19:06 +0200 Subject: [PATCH] =?UTF-8?q?Use=20=C2=B4manual=C2=B4=20ACE=5FThread=5FMutex?= =?UTF-8?q?=20objects=20in=20SQLTransaction=20class=20instead=20of=20using?= =?UTF-8?q?=20ACE=5FBased::LockedQueue.=20This=20will=20either=20result=20?= =?UTF-8?q?in=20a=20crash=20fix=20caused=20by=20underlying=20operations=20?= =?UTF-8?q?of=20ACE=5FBased::LockedQueue,=20or=20at=20least=20give=20us=20?= =?UTF-8?q?a=20clearer=20view=20at=20where=20the=20crash=20is=20coming=20f?= =?UTF-8?q?rom.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --HG-- branch : trunk --- src/shared/Database/SqlOperations.cpp | 23 +++++++++++++---------- src/shared/Database/SqlOperations.h | 13 ++++++++++--- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/shared/Database/SqlOperations.cpp b/src/shared/Database/SqlOperations.cpp index 8894f896855..785c5cb84e7 100644 --- a/src/shared/Database/SqlOperations.cpp +++ b/src/shared/Database/SqlOperations.cpp @@ -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(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(sql)); - m_queue.pop_front(); + free((void*)const_cast(m_queue.front())); + m_queue.pop(); } - + m_Mutex.release(); return; } free((void*)const_cast(sql)); - m_queue.pop_front(); + m_queue.pop(); } db->DirectExecute("COMMIT"); + m_Mutex.release(); } /// ---- ASYNC QUERIES ---- diff --git a/src/shared/Database/SqlOperations.h b/src/shared/Database/SqlOperations.h index dcdada9cb59..f2e09c0c921 100644 --- a/src/shared/Database/SqlOperations.h +++ b/src/shared/Database/SqlOperations.h @@ -57,12 +57,19 @@ class SqlStatement : public SqlOperation class SqlTransaction : public SqlOperation { - typedef ACE_Based::LockedQueue LockedQueue; private: - LockedQueue m_queue; + std::queue 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); };