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();
#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);
}
+3 -3
View File
@@ -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
+29
View File
@@ -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