1.1 --- a/core/Database.h Fri Jul 13 19:19:30 2007 +0000
1.2 +++ b/core/Database.h Fri Jul 13 19:20:12 2007 +0000
1.3 @@ -22,6 +22,9 @@
1.4 #include <sh_list.h>
1.5 #include <ITextParsers.h>
1.6 #include "sm_memtable.h"
1.7 +#include <IThreader.h>
1.8 +#include "sm_simple_prioqueue.h"
1.9 +#include "PluginSys.h"
1.10
1.11 using namespace SourceHook;
1.12
1.13 @@ -41,11 +44,24 @@
1.14 DatabaseInfo info;
1.15 };
1.16
1.17 +class IDBThreadOperation
1.18 +{
1.19 +public:
1.20 + virtual IDBDriver *GetDriver() =0;
1.21 + virtual CPlugin *GetPlugin() =0;
1.22 + virtual void RunThreadPart() =0;
1.23 + virtual void RunThinkPart() =0;
1.24 + virtual void CancelThinkPart() =0;
1.25 +};
1.26 +
1.27 class DBManager :
1.28 public IDBManager,
1.29 public SMGlobalClass,
1.30 public IHandleTypeDispatch,
1.31 - public ITextListener_SMC
1.32 + public ITextListener_SMC,
1.33 + public IThread,
1.34 + public IThreadWorkerCallbacks,
1.35 + public IPluginsListener
1.36 {
1.37 public:
1.38 DBManager();
1.39 @@ -74,12 +90,41 @@
1.40 SMCParseResult ReadSMC_KeyValue(const char *key, const char *value, bool key_quotes, bool value_quotes);
1.41 SMCParseResult ReadSMC_LeavingSection();
1.42 void ReadSMC_ParseEnd(bool halted, bool failed);
1.43 +public: //IThread
1.44 + void RunThread(IThreadHandle *pThread);
1.45 + void OnTerminate(IThreadHandle *pThread, bool cancel);
1.46 +public: //IThreadWorkerCallbacks
1.47 + void OnWorkerStart(IThreadWorker *pWorker);
1.48 + void OnWorkerStop(IThreadWorker *pWorker);
1.49 +public: //IPluginsListener
1.50 + void OnPluginUnloaded(IPlugin *plugin);
1.51 public:
1.52 ConfDbInfo *GetDatabaseConf(const char *name);
1.53 IDBDriver *FindOrLoadDriver(const char *name);
1.54 IDBDriver *GetDefaultDriver();
1.55 + const char *GetDefaultDriverName();
1.56 + bool AddToThreadQueue(IDBThreadOperation *op, PrioQueueLevel prio);
1.57 + void LockConfig();
1.58 + void UnlockConfig();
1.59 + void RunFrame();
1.60 + inline HandleType_t GetDatabaseType()
1.61 + {
1.62 + return m_DatabaseType;
1.63 + }
1.64 +private:
1.65 + void KillWorkerThread();
1.66 private:
1.67 CVector<IDBDriver *> m_drivers;
1.68 +
1.69 + /* Threading stuff */
1.70 + PrioQueue<IDBThreadOperation *> m_OpQueue;
1.71 + Queue<IDBThreadOperation *> m_ThinkQueue;
1.72 + CVector<bool> m_drSafety; /* which drivers are safe? */
1.73 + IThreadWorker *m_pWorker; /* Worker thread object */
1.74 + IMutex *m_pConfigLock; /* Configuration lock */
1.75 + IMutex *m_pQueueLock; /* Queue safety lock */
1.76 + IMutex *m_pThinkLock; /* Think-queue lock */
1.77 +
1.78 List<ConfDbInfo> m_confs;
1.79 HandleType_t m_DriverType;
1.80 HandleType_t m_DatabaseType;