summaryrefslogtreecommitdiff
path: root/source/libs/asura-lib-utils/threading
diff options
context:
space:
mode:
Diffstat (limited to 'source/libs/asura-lib-utils/threading')
-rw-r--r--source/libs/asura-lib-utils/threading/binding/_thread.cpp9
-rw-r--r--source/libs/asura-lib-utils/threading/coroutine.cpp16
-rw-r--r--source/libs/asura-lib-utils/threading/coroutine.h9
-rw-r--r--source/libs/asura-lib-utils/threading/mutex.cpp55
-rw-r--r--source/libs/asura-lib-utils/threading/mutex.h33
-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.cpp22
-rw-r--r--source/libs/asura-lib-utils/threading/thread.h21
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;
};