diff -r a9d7047a8d4b -r 8e11b2ebdc22 core/Database.h --- a/core/Database.h Fri Jul 13 19:19:30 2007 +0000 +++ b/core/Database.h Fri Jul 13 19:20:12 2007 +0000 @@ -22,6 +22,9 @@ #include #include #include "sm_memtable.h" +#include +#include "sm_simple_prioqueue.h" +#include "PluginSys.h" using namespace SourceHook; @@ -41,11 +44,24 @@ DatabaseInfo info; }; +class IDBThreadOperation +{ +public: + virtual IDBDriver *GetDriver() =0; + virtual CPlugin *GetPlugin() =0; + virtual void RunThreadPart() =0; + virtual void RunThinkPart() =0; + virtual void CancelThinkPart() =0; +}; + class DBManager : public IDBManager, public SMGlobalClass, public IHandleTypeDispatch, - public ITextListener_SMC + public ITextListener_SMC, + public IThread, + public IThreadWorkerCallbacks, + public IPluginsListener { public: DBManager(); @@ -74,12 +90,41 @@ SMCParseResult ReadSMC_KeyValue(const char *key, const char *value, bool key_quotes, bool value_quotes); SMCParseResult ReadSMC_LeavingSection(); void ReadSMC_ParseEnd(bool halted, bool failed); +public: //IThread + void RunThread(IThreadHandle *pThread); + void OnTerminate(IThreadHandle *pThread, bool cancel); +public: //IThreadWorkerCallbacks + void OnWorkerStart(IThreadWorker *pWorker); + void OnWorkerStop(IThreadWorker *pWorker); +public: //IPluginsListener + void OnPluginUnloaded(IPlugin *plugin); public: ConfDbInfo *GetDatabaseConf(const char *name); IDBDriver *FindOrLoadDriver(const char *name); IDBDriver *GetDefaultDriver(); + const char *GetDefaultDriverName(); + bool AddToThreadQueue(IDBThreadOperation *op, PrioQueueLevel prio); + void LockConfig(); + void UnlockConfig(); + void RunFrame(); + inline HandleType_t GetDatabaseType() + { + return m_DatabaseType; + } +private: + void KillWorkerThread(); private: CVector m_drivers; + + /* Threading stuff */ + PrioQueue m_OpQueue; + Queue m_ThinkQueue; + CVector m_drSafety; /* which drivers are safe? */ + IThreadWorker *m_pWorker; /* Worker thread object */ + IMutex *m_pConfigLock; /* Configuration lock */ + IMutex *m_pQueueLock; /* Queue safety lock */ + IMutex *m_pThinkLock; /* Think-queue lock */ + List m_confs; HandleType_t m_DriverType; HandleType_t m_DatabaseType;