diff options
Diffstat (limited to 'source/libs/asura-lib-utils/threading')
-rw-r--r-- | source/libs/asura-lib-utils/threading/binding/_thread.cpp | 9 | ||||
-rw-r--r-- | source/libs/asura-lib-utils/threading/coroutine.cpp | 16 | ||||
-rw-r--r-- | source/libs/asura-lib-utils/threading/coroutine.h | 9 | ||||
-rw-r--r-- | source/libs/asura-lib-utils/threading/mutex.cpp | 55 | ||||
-rw-r--r-- | source/libs/asura-lib-utils/threading/mutex.h | 33 | ||||
-rw-r--r-- | source/libs/asura-lib-utils/threading/task.cpp (renamed from source/libs/asura-lib-utils/threading/thread_task.cpp) | 0 | ||||
-rw-r--r-- | source/libs/asura-lib-utils/threading/task.h (renamed from source/libs/asura-lib-utils/threading/thread_task.h) | 8 | ||||
-rw-r--r-- | source/libs/asura-lib-utils/threading/thread.cpp | 22 | ||||
-rw-r--r-- | source/libs/asura-lib-utils/threading/thread.h | 21 |
9 files changed, 126 insertions, 47 deletions
diff --git a/source/libs/asura-lib-utils/threading/binding/_thread.cpp b/source/libs/asura-lib-utils/threading/binding/_thread.cpp index 9f6d228..00252a9 100644 --- a/source/libs/asura-lib-utils/threading/binding/_thread.cpp +++ b/source/libs/asura-lib-utils/threading/binding/_thread.cpp @@ -1,4 +1,5 @@ #include "../thread.h" +#include "../task.h" using namespace std; @@ -33,7 +34,7 @@ namespace AsuraEngine cc8* name = state.GetValue<cc8*>(1, ""); - Thread* thread = new Thread(name); + Thread* thread = new Thread(state, name); thread->PushLuaxUserdata(state); return 1; @@ -63,14 +64,14 @@ namespace AsuraEngine return 0; } - // successed = thread:AddTask(thread_task) + // successed = thread:AddTask(task) LUAX_IMPL_METHOD(Thread, _AddTask) { LUAX_PREPARE(L, Thread); - ThreadTask* task = state.GetUserdata<ThreadTask>(2); + Task* task = state.GetUserdata<Task>(2); self->AddTask(task); - self->LuaxRetain<ThreadTask>(state, task); + self->LuaxRetain<Task>(state, task); return 0; } diff --git a/source/libs/asura-lib-utils/threading/coroutine.cpp b/source/libs/asura-lib-utils/threading/coroutine.cpp index e69de29..9f65c5f 100644 --- a/source/libs/asura-lib-utils/threading/coroutine.cpp +++ b/source/libs/asura-lib-utils/threading/coroutine.cpp @@ -0,0 +1,16 @@ +#include "coroutine.h" + +namespace AsuraEngine +{ + namespace Threading + { +/* + Coroutine::Coroutine() + { + + } +*/ + + + } +} diff --git a/source/libs/asura-lib-utils/threading/coroutine.h b/source/libs/asura-lib-utils/threading/coroutine.h index 75d9a10..01af654 100644 --- a/source/libs/asura-lib-utils/threading/coroutine.h +++ b/source/libs/asura-lib-utils/threading/coroutine.h @@ -1,7 +1,7 @@ #ifndef __ASURA_COROUTINE_H__ #define __ASURA_COROUTINE_H__ -#include <asura-lib-utils/scripting/portable.hpp> +#include "../scripting/portable.hpp" namespace AsuraEngine { @@ -18,8 +18,15 @@ namespace AsuraEngine LUAX_DECL_FACTORY(Coroutine); + + private: + /// + /// ǰЭ̵state + /// + lua_State* mThreadState; + LUAX_DECL_METHOD(_New); LUAX_DECL_METHOD(_Run); diff --git a/source/libs/asura-lib-utils/threading/mutex.cpp b/source/libs/asura-lib-utils/threading/mutex.cpp index e0b6e1e..663ac28 100644 --- a/source/libs/asura-lib-utils/threading/mutex.cpp +++ b/source/libs/asura-lib-utils/threading/mutex.cpp @@ -23,8 +23,11 @@ namespace AsuraEngine Mutex::Mutex() : mImpl(nullptr) { -#if ASURA_THREAD_WIN32 - try_create_mutex(MutexImplWin32); +#if ASURA_MUTEX_WIN32_CRITICLE_SECTION + try_create_mutex(MutexImplWin32_CS); +#endif +#if ASURA_MUTEX_WIN32_KERNAL_MUTEX + try_create_mutex(MutexImplWin32_KM); #endif ASSERT(mImpl); } @@ -48,34 +51,56 @@ namespace AsuraEngine mImpl->Unlock(); } -#if ASURA_THREAD_WIN32 - MutexImplWin32::MutexImplWin32() +#if ASURA_MUTEX_WIN32_CRITICLE_SECTION + + MutexImplWin32_CS::MutexImplWin32_CS() { - //mHandle = ::CreateMutex(NULL, FALSE, NULL); - //if (!mHandle) - // throw Exception("Cant use win32 mutex."); ::InitializeCriticalSection(&mMutex); } - MutexImplWin32::~MutexImplWin32() + MutexImplWin32_CS::~MutexImplWin32_CS() { - //::CloseHandle(mHandle); - //mHandle = NULL; ::DeleteCriticalSection(&mMutex); } - void MutexImplWin32::Lock() + void MutexImplWin32_CS::Lock() { - //::WaitForSingleObject(mHandle, INFINITE); ::EnterCriticalSection(&mMutex); } - void MutexImplWin32::Unlock() + void MutexImplWin32_CS::Unlock() { - //::ReleaseMutex(mHandle); ::LeaveCriticalSection(&mMutex); } -#endif // ASURA_THREAD_WIN32 + +#endif // ASURA_MUTEX_WIN32_CRITICLE_SECTION + +#if ASURA_MUTEX_WIN32_KERNAL_MUTEX + + MutexImplWin32_KM::MutexImplWin32_KM() + { + mHandle = ::CreateMutex(NULL, FALSE, NULL); + if (!mHandle) + throw Exception("Cant use win32 mutex."); + } + + MutexImplWin32_KM::~MutexImplWin32_KM() + { + ::CloseHandle(mHandle); + mHandle = NULL; + } + + void MutexImplWin32_KM::Lock() + { + ::WaitForSingleObject(mHandle, INFINITE); + } + + void MutexImplWin32_KM::Unlock() + { + ::ReleaseMutex(mHandle); + } + +#endif // ASURA_MUTEX_WIN32_KERNAL_MUTEX } } diff --git a/source/libs/asura-lib-utils/threading/mutex.h b/source/libs/asura-lib-utils/threading/mutex.h index 5ed45ae..51fe63e 100644 --- a/source/libs/asura-lib-utils/threading/mutex.h +++ b/source/libs/asura-lib-utils/threading/mutex.h @@ -49,6 +49,7 @@ namespace AsuraEngine Mutex& m; }; +// ڵջӴλÿʼջΪٽ #define lock(mutex) Lock _asura_scoped_lock_0x0_(mutex) #define lock2(mutex) Lock _asura_scoped_lock_0x1_(mutex) #define lock3(mutex) Lock _asura_scoped_lock_0x2_(mutex) @@ -67,27 +68,47 @@ namespace AsuraEngine }; -#if ASURA_THREAD_WIN32 +#if ASURA_MUTEX_WIN32_CRITICLE_SECTION //https://blog.csdn.net/l799623787/article/details/18259949 - class MutexImplWin32 ASURA_FINAL : public MutexImpl + class MutexImplWin32_CS ASURA_FINAL : public MutexImpl { public: - MutexImplWin32(); - ~MutexImplWin32(); + MutexImplWin32_CS(); + ~MutexImplWin32_CS(); void Lock() override; void Unlock() override; - private: + private: //HANDLE mHandle; CRITICAL_SECTION mMutex; }; -#endif // ASURA_THREAD_WIN32 +#endif // ASURA_MUTEX_WIN32_CRITICLE_SECTION + +#if ASURA_MUTEX_WIN32_KERNAL_MUTEX + + class MutexImplWin32_KM ASURA_FINAL : public MutexImpl + { + public: + + MutexImplWin32_KM(); + ~MutexImplWin32_KM(); + + void Lock() override; + void Unlock() override; + + private: + + HANDLE mHandle; + + }; + +#endif // ASURA_MUTEX_WIN32_KERNAL_MUTEX #if ASURA_THREAD_STD diff --git a/source/libs/asura-lib-utils/threading/thread_task.cpp b/source/libs/asura-lib-utils/threading/task.cpp index e69de29..e69de29 100644 --- a/source/libs/asura-lib-utils/threading/thread_task.cpp +++ b/source/libs/asura-lib-utils/threading/task.cpp diff --git a/source/libs/asura-lib-utils/threading/thread_task.h b/source/libs/asura-lib-utils/threading/task.h index 1ea0a1a..9f78860 100644 --- a/source/libs/asura-lib-utils/threading/thread_task.h +++ b/source/libs/asura-lib-utils/threading/task.h @@ -12,13 +12,13 @@ namespace AsuraEngine /// /// ϣһ̴̳߳TaskдExecute /// - ASURA_ABSTRACT class ThreadTask + ASURA_ABSTRACT class Task : virtual public AEScripting::NativeAccessor { public: - ThreadTask(); - virtual ~ThreadTask(); + Task(); + virtual ~Task(); /// /// ִɺtrueûص @@ -28,7 +28,7 @@ namespace AsuraEngine /// /// ûص /// - virtual void Invoke() = 0; + virtual void Invoke(lua_State* thread) = 0; protected: diff --git a/source/libs/asura-lib-utils/threading/thread.cpp b/source/libs/asura-lib-utils/threading/thread.cpp index d1b055d..51738de 100644 --- a/source/libs/asura-lib-utils/threading/thread.cpp +++ b/source/libs/asura-lib-utils/threading/thread.cpp @@ -10,9 +10,12 @@ namespace AsuraEngine namespace Threading { - Thread::Thread(const std::string& name) + Thread::Thread(Luax::LuaxState& father, const std::string& name) : mName(name) { + mState = lua_newthread(father); + SetLuaxMemberRef(father, mStateRef, -1); + lua_pop(father, 1); // mState } Thread::~Thread() @@ -31,8 +34,9 @@ namespace AsuraEngine } \ } - bool Thread::AddTask(ThreadTask* task) + bool Thread::AddTask(Task* task) { + lock(mMutex); mTaskQueue.push(task); return true; } @@ -43,30 +47,30 @@ namespace AsuraEngine try_start_thread(ThreadImplWin32); #endif - assert(mImpl); + ASSERT(mImpl); } void Thread::Join() { - assert(mImpl); + ASSERT(mImpl); mImpl->Join(); } void Thread::Kill() { - assert(mImpl); + ASSERT(mImpl); mImpl->Kill(); } bool Thread::IsRunning() { - assert(mImpl); + ASSERT(mImpl); return mImpl->IsRunning(); } bool Thread::IsCurrent() { - assert(mImpl); + ASSERT(mImpl); return mImpl->IsCurrent(); } @@ -79,9 +83,9 @@ namespace AsuraEngine { while (!mTaskQueue.empty()) { - ThreadTask* task = mTaskQueue.front(); + Task* task = mTaskQueue.front(); if (task->Execute()) - task->Invoke(); + task->Invoke(mState); mMutex.Lock(); mTaskQueue.pop(); diff --git a/source/libs/asura-lib-utils/threading/thread.h b/source/libs/asura-lib-utils/threading/thread.h index 24b549c..1bd5f15 100644 --- a/source/libs/asura-lib-utils/threading/thread.h +++ b/source/libs/asura-lib-utils/threading/thread.h @@ -6,7 +6,7 @@ #include <asura-lib-utils/scripting/portable.hpp> -#include "thread_task.h" +#include "task.h" #include "mutex.h" namespace AsuraEngine @@ -26,10 +26,10 @@ namespace AsuraEngine LUAX_DECL_FACTORY(Thread); - Thread(const std::string& name = ""); + Thread(Luax::LuaxState& father, const std::string& name = ""); ~Thread(); - bool AddTask(ThreadTask* task); + bool AddTask(Task* task); void Start(uint32 stacksize = 0); @@ -66,15 +66,20 @@ namespace AsuraEngine LUAX_DECL_METHOD(_IsCurrent); LUAX_DECL_METHOD(_GetName); + ThreadImpl* mImpl; + std::string mName; + /// /// С /// - std::queue<ThreadTask*> mTaskQueue; - - Mutex mMutex; + std::queue<Task*> mTaskQueue; + Mutex mMutex; - ThreadImpl* mImpl; - std::string mName; + /// + /// ̵߳luaִջΪ˱ִջͻ + /// + lua_State* mState; + Luax::LuaxMemberRef mStateRef; }; |