Implement async class for database operations for better performance, remove 10ms sleep, fixed some crash on sql execute.

--HG--
branch : trunk
This commit is contained in:
n0n4m3
2010-02-07 08:22:31 +03:00
parent bb7222c376
commit 8676e5056f
3 changed files with 43 additions and 7 deletions
+11 -4
View File
@@ -32,15 +32,16 @@ void SqlDelayThread::run()
mysql_thread_init(); mysql_thread_init();
#endif #endif
// Lets wait for next async task no more than 2 secs
ACE_Time_Value _time(2);
while (m_running) while (m_running)
{ {
// if the running state gets turned off while sleeping // if the running state gets turned off while sleeping
// empty the queue before exiting // empty the queue before exiting
ACE_Based::Thread::Sleep(10); SqlAsyncTask * s = (SqlAsyncTask*)m_sqlQueue.dequeue(/*&_time*/);
SqlOperation* s; if(s)
while (m_sqlQueue.next(s))
{ {
s->Execute(m_dbEngine); s->call();
delete s; delete s;
} }
} }
@@ -53,5 +54,11 @@ void SqlDelayThread::run()
void SqlDelayThread::Stop() void SqlDelayThread::Stop()
{ {
m_running = false; 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);
}
+3 -3
View File
@@ -22,7 +22,7 @@
#define __SQLDELAYTHREAD_H #define __SQLDELAYTHREAD_H
#include "ace/Thread_Mutex.h" #include "ace/Thread_Mutex.h"
#include "LockedQueue.h" #include "ace/Activation_Queue.h"
#include "Threading.h" #include "Threading.h"
class Database; class Database;
@@ -30,7 +30,7 @@ class SqlOperation;
class SqlDelayThread : public ACE_Based::Runnable class SqlDelayThread : public ACE_Based::Runnable
{ {
typedef ACE_Based::LockedQueue<SqlOperation*, ACE_Thread_Mutex> SqlQueue; typedef ACE_Activation_Queue SqlQueue;
private: private:
SqlQueue m_sqlQueue; ///< Queue of SQL statements SqlQueue m_sqlQueue; ///< Queue of SQL statements
@@ -42,7 +42,7 @@ class SqlDelayThread : public ACE_Based::Runnable
SqlDelayThread(Database* db); SqlDelayThread(Database* db);
///< Put sql statement to delay queue ///< 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 Stop(); ///< Stop event
virtual void run(); ///< Main Thread loop virtual void run(); ///< Main Thread loop
+29
View File
@@ -24,6 +24,7 @@
#include "Common.h" #include "Common.h"
#include "ace/Thread_Mutex.h" #include "ace/Thread_Mutex.h"
#include "ace/Method_Request.h"
#include "LockedQueue.h" #include "LockedQueue.h"
#include <queue> #include <queue>
#include "Utilities/Callback.h" #include "Utilities/Callback.h"
@@ -122,5 +123,33 @@ class SqlQueryHolderEx : public SqlOperation
: m_holder(holder), m_callback(callback), m_queue(queue) {} : m_holder(holder), m_callback(callback), m_queue(queue) {}
void Execute(Database *db); 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 #endif //__SQLOPERATIONS_H