summaryrefslogtreecommitdiff
path: root/source/modules/asura-utils/threading/thread.h
diff options
context:
space:
mode:
Diffstat (limited to 'source/modules/asura-utils/threading/thread.h')
-rw-r--r--source/modules/asura-utils/threading/thread.h414
1 files changed, 206 insertions, 208 deletions
diff --git a/source/modules/asura-utils/threading/thread.h b/source/modules/asura-utils/threading/thread.h
index 1de4e33..0235b6a 100644
--- a/source/modules/asura-utils/threading/thread.h
+++ b/source/modules/asura-utils/threading/thread.h
@@ -11,214 +11,212 @@
#include "semaphore.h"
#include "threadable.h"
-namespace AsuraEngine
+namespace_begin(AsuraEngine)
+namespace_begin(Threading)
+
+class ThreadImpl;
+
+///
+/// ̵߳ļֲͬʵ֣
+/// 1: Deferredӳģʽ߳ϵɺҪ̵ֶ߳Dispatch
+/// ̵߳ص첽Ϊͬlua_Stateͻ⡣
+/// 2: Immediateģʽÿһ߳άһlua_newthreadlua_State
+/// صڲͬlua_Stateеãⲻ̷ͬ߳ͬһlua_State
+///
+enum ThreadType
{
- namespace Threading
- {
-
- class ThreadImpl;
-
- ///
- /// ̵߳ļֲͬʵ֣
- /// 1: Deferredӳģʽ߳ϵɺҪ̵ֶ߳Dispatch
- /// ̵߳ص첽Ϊͬlua_Stateͻ⡣
- /// 2: Immediateģʽÿһ߳άһlua_newthreadlua_State
- /// صڲͬlua_Stateеãⲻ̷ͬ߳ͬһlua_State
- ///
- enum ThreadType
- {
- THREAD_TYPE_DEFERRED,
- THREAD_TYPE_IMMEDIATE, // unsafe
- };
-
- enum ThreadState
- {
- THREAD_STATE_IDLE, ///< ãδں˶
- THREAD_STATE_RUNNING, ///< ѭ
- THREAD_STATE_PAUSED, ///< ѭͣ
- THREAD_STATE_STOPPED, ///< ˳ѭ
- };
-
- ///
- /// ߳壬ÿ߳άһtask queue
- ///
- class Thread ASURA_FINAL
- : public AEScripting::Portable<Thread>
- , public Threadable
- {
- public:
-
- LUAX_DECL_FACTORY(Thread);
-
- Thread(lua_State* luaThread, ThreadType type = THREAD_TYPE_DEFERRED, uint sleepTime = 1, const std::string& name = "");
- ~Thread();
-
- bool AddTask(Task* task);
- ///
- /// õȴ
- ///
- uint GetTaskCount();
-
- void Idle();
-
- ///
- /// ں˶󣬲Сdaemonȴֶstopijʱ̶ɺԶstop
- ///
- bool Start(bool daemon = true, uint32 stacksize = 0);
-
- ///
- /// ͬ߳̿ƣʵʱġҪ߳ʹIsȷϵָ״̬
- ///
- void Pause();
- void Resume();
- void Stop();
-
- ///
- /// ͬ߳̿ƣȷźźִС̵߳ȴ
- ///
- void PauseSync();
- void ResumeSync();
- void StopSync();
-
- ///
- /// ̵߳ȴ߳̽żִС
- ///
- void Join();
-
- ThreadState GetState();
-
- ///
- /// ߼߳״̬
- /// 1: IdleУ̴߳Ĭ״̬ʱStart
- /// 2: RunningУں˶´Ѿں˵УTask
- /// 3: PausedͣȻںУ˶Ĵ߼ͣ
- /// 4: StoppedֹͣȻںУѾ޷
- ///
- bool IsIdle();
- bool IsRunning();
- bool IsPaused();
- bool IsStopped();
-
- bool IsCurrent();
-
- ///
- /// ִС
- ///
- int Process() override;
-
- const std::string& GetName();
-
- ///
- /// ص
- ///
- void Dispatch();
-
- ///
- /// ߺ
- ///
- void Sleep(uint ms);
-
- ///
- /// ʱ
- ///
- void SetSleepTime(uint ms);
-
- private:
-
- //----------------------------------------------------------------------------//
-
- LUAX_DECL_ENUM(ThreadType);
- LUAX_DECL_ENUM(ThreadState);
-
- LUAX_DECL_METHOD(_New);
- LUAX_DECL_METHOD(_AddTask);
- LUAX_DECL_METHOD(_Start);
- LUAX_DECL_METHOD(_Idle);
- LUAX_DECL_METHOD(_Pause);
- LUAX_DECL_METHOD(_Resume);
- LUAX_DECL_METHOD(_Stop);
- LUAX_DECL_METHOD(_Join);
- LUAX_DECL_METHOD(_IsRunning);
- LUAX_DECL_METHOD(_IsPaused);
- LUAX_DECL_METHOD(_IsStopped);
- LUAX_DECL_METHOD(_IsCurrent);
- LUAX_DECL_METHOD(_Sleep);
- LUAX_DECL_METHOD(_Dispatch);
- LUAX_DECL_METHOD(_GetName);
- LUAX_DECL_METHOD(_GetType);
- LUAX_DECL_METHOD(_GetState);
- LUAX_DECL_METHOD(_SetSleepTime);
-
- //----------------------------------------------------------------------------//
-
- ThreadImpl* m_Impl;
-
- lua_State* m_LuaThread;
-
- ///
- /// ˴Ƿػģʽ
- ///
- bool m_IsDaemon;
-
- std::string m_Name;
- ThreadType m_Type;
- uint m_SleepTime;
-
- ThreadState m_State;
- Mutex m_StateMutex;
-
- ///
- /// ͬصź
- ///
- Semaphore m_SemPause;
- Semaphore m_SemResume;
- Semaphore m_SemStop;
-
- ///
- /// С
- ///
- std::queue<Task*> m_TaskQueue;
- Mutex m_TaskQueueMutex;
-
- ///
- /// ӳģʽʹ
- ///
- std::queue<Task*> m_FinishedTasks;
- Mutex m_FinishedMutex;
-
- ///
- /// ģʽʹãصʹõlua߳
- ///
- lua_State* m_CallbackThread;
- Luax::LuaxMemberRef m_CallbackThreadRef;
-
- };
-
- ///
- /// ̵߳ľʵ֣û͸ģһ׼ֲԣ
- /// 1: win32
- /// 2: posix
- /// 3: SDL
- /// 4: std::thread
- ///
- ASURA_ABSTRACT class ThreadImpl
- {
- public:
- ThreadImpl() {};
- virtual ~ThreadImpl() {};
-
- virtual bool Start(Threadable* thread, uint32 stacksize = 0) = 0;
- virtual void Join() = 0;
- virtual void Kill() = 0;
-
- virtual void Sleep(uint ms) = 0;
-
- virtual bool IsRunning() = 0;
- virtual bool IsCurrent() = 0;
-
- };
-
- }
-}
+ THREAD_TYPE_DEFERRED,
+ THREAD_TYPE_IMMEDIATE, // unsafe
+};
+
+enum ThreadState
+{
+ THREAD_STATE_IDLE, ///< ãδں˶
+ THREAD_STATE_RUNNING, ///< ѭ
+ THREAD_STATE_PAUSED, ///< ѭͣ
+ THREAD_STATE_STOPPED, ///< ˳ѭ
+};
+
+///
+/// ߳壬ÿ߳άһtask queue
+///
+class Thread ASURA_FINAL
+ : public AEScripting::Portable<Thread>
+ , public Threadable
+{
+public:
+
+ LUAX_DECL_FACTORY(Thread);
+
+ Thread(lua_State* luaThread, ThreadType type = THREAD_TYPE_DEFERRED, uint sleepTime = 1, const std::string& name = "");
+ ~Thread();
+
+ bool AddTask(Task* task);
+ ///
+ /// õȴ
+ ///
+ uint GetTaskCount();
+
+ void Idle();
+
+ ///
+ /// ں˶󣬲Сdaemonȴֶstopijʱ̶ɺԶstop
+ ///
+ bool Start(bool daemon = true, uint32 stacksize = 0);
+
+ ///
+ /// ͬ߳̿ƣʵʱġҪ߳ʹIsȷϵָ״̬
+ ///
+ void Pause();
+ void Resume();
+ void Stop();
+
+ ///
+ /// ͬ߳̿ƣȷźźִС̵߳ȴ
+ ///
+ void PauseSync();
+ void ResumeSync();
+ void StopSync();
+
+ ///
+ /// ̵߳ȴ߳̽żִС
+ ///
+ void Join();
+
+ ThreadState GetState();
+
+ ///
+ /// ߼߳״̬
+ /// 1: IdleУ̴߳Ĭ״̬ʱStart
+ /// 2: RunningУں˶´Ѿں˵УTask
+ /// 3: PausedͣȻںУ˶Ĵ߼ͣ
+ /// 4: StoppedֹͣȻںУѾ޷
+ ///
+ bool IsIdle();
+ bool IsRunning();
+ bool IsPaused();
+ bool IsStopped();
+
+ bool IsCurrent();
+
+ ///
+ /// ִС
+ ///
+ int Process() override;
+
+ const std::string& GetName();
+
+ ///
+ /// ص
+ ///
+ void Dispatch();
+
+ ///
+ /// ߺ
+ ///
+ void Sleep(uint ms);
+
+ ///
+ /// ʱ
+ ///
+ void SetSleepTime(uint ms);
+
+private:
+
+ //----------------------------------------------------------------------------//
+
+ LUAX_DECL_ENUM(ThreadType);
+ LUAX_DECL_ENUM(ThreadState);
+
+ LUAX_DECL_METHOD(_New);
+ LUAX_DECL_METHOD(_AddTask);
+ LUAX_DECL_METHOD(_Start);
+ LUAX_DECL_METHOD(_Idle);
+ LUAX_DECL_METHOD(_Pause);
+ LUAX_DECL_METHOD(_Resume);
+ LUAX_DECL_METHOD(_Stop);
+ LUAX_DECL_METHOD(_Join);
+ LUAX_DECL_METHOD(_IsRunning);
+ LUAX_DECL_METHOD(_IsPaused);
+ LUAX_DECL_METHOD(_IsStopped);
+ LUAX_DECL_METHOD(_IsCurrent);
+ LUAX_DECL_METHOD(_Sleep);
+ LUAX_DECL_METHOD(_Dispatch);
+ LUAX_DECL_METHOD(_GetName);
+ LUAX_DECL_METHOD(_GetType);
+ LUAX_DECL_METHOD(_GetState);
+ LUAX_DECL_METHOD(_SetSleepTime);
+
+ //----------------------------------------------------------------------------//
+
+ ThreadImpl* m_Impl;
+
+ lua_State* m_LuaThread;
+
+ ///
+ /// ˴Ƿػģʽ
+ ///
+ bool m_IsDaemon;
+
+ std::string m_Name;
+ ThreadType m_Type;
+ uint m_SleepTime;
+
+ ThreadState m_State;
+ Mutex m_StateMutex;
+
+ ///
+ /// ͬصź
+ ///
+ Semaphore m_SemPause;
+ Semaphore m_SemResume;
+ Semaphore m_SemStop;
+
+ ///
+ /// С
+ ///
+ std::queue<Task*> m_TaskQueue;
+ Mutex m_TaskQueueMutex;
+
+ ///
+ /// ӳģʽʹ
+ ///
+ std::queue<Task*> m_FinishedTasks;
+ Mutex m_FinishedMutex;
+
+ ///
+ /// ģʽʹãصʹõlua߳
+ ///
+ lua_State* m_CallbackThread;
+ Luax::LuaxMemberRef m_CallbackThreadRef;
+
+};
+
+///
+/// ̵߳ľʵ֣û͸ģһ׼ֲԣ
+/// 1: win32
+/// 2: posix
+/// 3: SDL
+/// 4: std::thread
+///
+ASURA_ABSTRACT class ThreadImpl
+{
+public:
+ ThreadImpl() {};
+ virtual ~ThreadImpl() {};
+
+ virtual bool Start(Threadable* thread, uint32 stacksize = 0) = 0;
+ virtual void Join() = 0;
+ virtual void Kill() = 0;
+
+ virtual void Sleep(uint ms) = 0;
+
+ virtual bool IsRunning() = 0;
+ virtual bool IsCurrent() = 0;
+
+};
+
+namespace_end
+namespace_end
#endif \ No newline at end of file