| @@ -85,7 +85,7 @@ struct ThreadJobType | |||
| class ThreadJob | |||
| { | |||
| friend class ThreadManager; | |||
| friend class BaseThreadManager; | |||
| public: | |||
| ThreadJob() { m_type = ThreadJobType::NONE; } | |||
| @@ -99,11 +99,14 @@ protected: | |||
| ThreadJobType m_type; | |||
| }; | |||
| class ThreadManager : public Entity | |||
| //Base class for thread manager | |||
| class BaseThreadManager : public Entity | |||
| { | |||
| public: | |||
| ThreadManager(int thread_count); | |||
| ~ThreadManager(); | |||
| BaseThreadManager(int thread_count); | |||
| ~BaseThreadManager(); | |||
| char const *GetName() { return "<BaseThreadManager>"; } | |||
| //Initialize, Ticker::Ref and start the thread | |||
| bool Start(); | |||
| @@ -111,15 +114,14 @@ public: | |||
| bool Stop(); | |||
| //Work stuff | |||
| bool AddWork(ThreadJob* job); | |||
| protected: | |||
| bool FetchResult(Array<ThreadJob*>& results); | |||
| //Base thread work function | |||
| static void *BaseThreadWork(void* data); | |||
| virtual void TickGame(float seconds); | |||
| virtual void TreatResult(ThreadJob* result) { } | |||
| //Default behaviour : delete the job result | |||
| virtual void TreatResult(ThreadJob* result) { delete(result); } | |||
| char const *GetName() { return "<ThreadManager>"; } | |||
| protected: | |||
| /* Worker threads */ | |||
| int m_thread_count; | |||
| Array<Thread*> m_threads; | |||
| @@ -128,6 +130,28 @@ protected: | |||
| Queue<ThreadJob*> m_resultqueue; | |||
| Array<ThreadJob*> m_job_dispatch; | |||
| }; | |||
| //Generic class for thread manager, executes work and store results, for you to use | |||
| class GenericThreadManager : public BaseThreadManager | |||
| { | |||
| public: | |||
| GenericThreadManager(int thread_count) | |||
| : BaseThreadManager(thread_count) { } | |||
| char const *GetName() { return "<GenericThreadManager>"; } | |||
| bool GetWorkResult(Array<ThreadJob*>& results) | |||
| { | |||
| results += m_job_result; | |||
| m_job_result.Empty(); | |||
| return results.Count() > 0; | |||
| } | |||
| protected: | |||
| virtual void TreatResult(ThreadJob* result) { m_job_result << result; } | |||
| Array<ThreadJob*> m_job_result; | |||
| }; | |||
| #endif | |||
| } /* namespace lol */ | |||
| @@ -19,17 +19,17 @@ namespace lol | |||
| { | |||
| #if LOL_FEATURE_THREADS | |||
| ThreadManager::ThreadManager(int thread_count) | |||
| BaseThreadManager::BaseThreadManager(int thread_count) | |||
| { | |||
| m_thread_count = thread_count; | |||
| } | |||
| ThreadManager::~ThreadManager() | |||
| BaseThreadManager::~BaseThreadManager() | |||
| { | |||
| Stop(); | |||
| } | |||
| //Initialize, Ticker::Ref and start the thread | |||
| bool ThreadManager::Start() | |||
| bool BaseThreadManager::Start() | |||
| { | |||
| if (m_threads.Count() > 0) | |||
| return false; | |||
| @@ -45,7 +45,7 @@ bool ThreadManager::Start() | |||
| } | |||
| //Stop the threads | |||
| bool ThreadManager::Stop() | |||
| bool BaseThreadManager::Stop() | |||
| { | |||
| if (m_threads.Count() <= 0) | |||
| return false; | |||
| @@ -62,13 +62,13 @@ bool ThreadManager::Stop() | |||
| } | |||
| //Work stuff | |||
| bool ThreadManager::AddWork(ThreadJob* job) | |||
| bool BaseThreadManager::AddWork(ThreadJob* job) | |||
| { | |||
| if (m_jobqueue.TryPush(job)) | |||
| return true; | |||
| return false; | |||
| } | |||
| bool ThreadManager::FetchResult(Array<ThreadJob*>& results) | |||
| bool BaseThreadManager::FetchResult(Array<ThreadJob*>& results) | |||
| { | |||
| ThreadJob* result; | |||
| while (m_resultqueue.TryPop(result)) | |||
| @@ -77,9 +77,9 @@ bool ThreadManager::FetchResult(Array<ThreadJob*>& results) | |||
| } | |||
| //Base thread work function | |||
| void *ThreadManager::BaseThreadWork(void* data) | |||
| void *BaseThreadManager::BaseThreadWork(void* data) | |||
| { | |||
| ThreadManager *that = (ThreadManager *)data; | |||
| BaseThreadManager *that = (BaseThreadManager *)data; | |||
| that->m_spawnqueue.Push(ThreadStatus::THREAD_STARTED); | |||
| for ( ; ; ) | |||
| { | |||
| @@ -99,7 +99,7 @@ void *ThreadManager::BaseThreadWork(void* data) | |||
| return NULL; | |||
| } | |||
| void ThreadManager::TickGame(float seconds) | |||
| void BaseThreadManager::TickGame(float seconds) | |||
| { | |||
| //Start if needed | |||
| Start(); | |||
| @@ -117,7 +117,6 @@ void ThreadManager::TickGame(float seconds) | |||
| ThreadJob* job = result[i]; | |||
| if (job->GetJobType() == ThreadJobType::WORK_DONE) | |||
| TreatResult(job); | |||
| delete(job); | |||
| } | |||
| } | |||
| } | |||