aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorn0n4m3 <none@none>2010-02-07 08:22:31 +0300
committern0n4m3 <none@none>2010-02-07 08:22:31 +0300
commit8676e5056f639c42256b0051d81286ee67af1d77 (patch)
treebd6dc47313eddd9030f7b6fdc033a99dfbb36d6f
parentbb7222c376785654ff3256e82fda28f4d8be7e98 (diff)
Implement async class for database operations for better performance, remove 10ms sleep, fixed some crash on sql execute.
--HG-- branch : trunk
-rw-r--r--src/shared/Database/SqlDelayThread.cpp15
-rw-r--r--src/shared/Database/SqlDelayThread.h6
-rw-r--r--src/shared/Database/SqlOperations.h29
3 files changed, 43 insertions, 7 deletions
diff --git a/src/shared/Database/SqlDelayThread.cpp b/src/shared/Database/SqlDelayThread.cpp
index 5b1c1a84b06..6efc9717345 100644
--- a/src/shared/Database/SqlDelayThread.cpp
+++ b/src/shared/Database/SqlDelayThread.cpp
@@ -32,15 +32,16 @@ void SqlDelayThread::run()
mysql_thread_init();
#endif
+ // Lets wait for next async task no more than 2 secs
+ ACE_Time_Value _time(2);
while (m_running)
{
// if the running state gets turned off while sleeping
// empty the queue before exiting
- ACE_Based::Thread::Sleep(10);
- SqlOperation* s;
- while (m_sqlQueue.next(s))
+ SqlAsyncTask * s = (SqlAsyncTask*)m_sqlQueue.dequeue(/*&_time*/);
+ if(s)
{
- s->Execute(m_dbEngine);
+ s->call();
delete s;
}
}
@@ -53,5 +54,11 @@ void SqlDelayThread::run()
void SqlDelayThread::Stop()
{
m_running = false;
+ m_sqlQueue.queue()->deactivate();
}
+bool SqlDelayThread::Delay(SqlOperation* sql)
+{
+ int res = m_sqlQueue.enqueue(new SqlAsyncTask(m_dbEngine, sql));
+ return (res != -1);
+}
diff --git a/src/shared/Database/SqlDelayThread.h b/src/shared/Database/SqlDelayThread.h
index a4e3aab1c93..15aeecb6bd7 100644
--- a/src/shared/Database/SqlDelayThread.h
+++ b/src/shared/Database/SqlDelayThread.h
@@ -22,7 +22,7 @@
#define __SQLDELAYTHREAD_H
#include "ace/Thread_Mutex.h"
-#include "LockedQueue.h"
+#include "ace/Activation_Queue.h"
#include "Threading.h"
class Database;
@@ -30,7 +30,7 @@ class SqlOperation;
class SqlDelayThread : public ACE_Based::Runnable
{
- typedef ACE_Based::LockedQueue<SqlOperation*, ACE_Thread_Mutex> SqlQueue;
+ typedef ACE_Activation_Queue SqlQueue;
private:
SqlQueue m_sqlQueue; ///< Queue of SQL statements
@@ -42,7 +42,7 @@ class SqlDelayThread : public ACE_Based::Runnable
SqlDelayThread(Database* db);
///< Put sql statement to delay queue
- bool Delay(SqlOperation* sql) { m_sqlQueue.add(sql); return true; }
+ bool Delay(SqlOperation* sql);
virtual void Stop(); ///< Stop event
virtual void run(); ///< Main Thread loop
diff --git a/src/shared/Database/SqlOperations.h b/src/shared/Database/SqlOperations.h
index 3a14abcc952..e815e514141 100644
--- a/src/shared/Database/SqlOperations.h
+++ b/src/shared/Database/SqlOperations.h
@@ -24,6 +24,7 @@
#include "Common.h"
#include "ace/Thread_Mutex.h"
+#include "ace/Method_Request.h"
#include "LockedQueue.h"
#include <queue>
#include "Utilities/Callback.h"
@@ -122,5 +123,33 @@ class SqlQueryHolderEx : public SqlOperation
: m_holder(holder), m_callback(callback), m_queue(queue) {}
void Execute(Database *db);
};
+
+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; }
+
+ int call()
+ {
+ if(m_db == NULL || m_op == NULL)
+ return -1;
+
+ try
+ {
+ m_op->Execute(m_db);
+ }
+ catch(...)
+ {
+ return -1;
+ }
+
+ return 0;
+ }
+
+private:
+ Database * m_db;
+ SqlOperation * m_op;
+};
#endif //__SQLOPERATIONS_H