diff options
author | n0n4m3 <none@none> | 2010-02-07 08:22:31 +0300 |
---|---|---|
committer | n0n4m3 <none@none> | 2010-02-07 08:22:31 +0300 |
commit | 8676e5056f639c42256b0051d81286ee67af1d77 (patch) | |
tree | bd6dc47313eddd9030f7b6fdc033a99dfbb36d6f | |
parent | bb7222c376785654ff3256e82fda28f4d8be7e98 (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.cpp | 15 | ||||
-rw-r--r-- | src/shared/Database/SqlDelayThread.h | 6 | ||||
-rw-r--r-- | src/shared/Database/SqlOperations.h | 29 |
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 |