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.cpp21
-rw-r--r--source/libs/asura-lib-utils/threading/mutex.h16
-rw-r--r--source/libs/asura-lib-utils/threading/task.cpp12
-rw-r--r--source/libs/asura-lib-utils/threading/task.h11
-rw-r--r--source/libs/asura-lib-utils/threading/thread.cpp14
-rw-r--r--source/libs/asura-lib-utils/threading/thread.h52
-rw-r--r--source/libs/asura-lib-utils/threading/thread_impl_posix.cpp9
-rw-r--r--source/libs/asura-lib-utils/threading/thread_impl_win32.cpp8
-rw-r--r--source/libs/asura-lib-utils/threading/thread_task.cpp0
-rw-r--r--source/libs/asura-lib-utils/threading/thread_task.h44
10 files changed, 156 insertions, 31 deletions
diff --git a/source/libs/asura-lib-utils/threading/binding/_thread.cpp b/source/libs/asura-lib-utils/threading/binding/_thread.cpp
index 00252a9..9403486 100644
--- a/source/libs/asura-lib-utils/threading/binding/_thread.cpp
+++ b/source/libs/asura-lib-utils/threading/binding/_thread.cpp
@@ -18,7 +18,8 @@ namespace AsuraEngine
{ "AddTask", _AddTask },
{ "IsRunning", _IsRunning },
{ "IsCurrent", _IsCurrent },
- { "GetName", _GetName }
+ { "GetName", _GetName },
+ { "Sleep", _Sleep }
);
}
@@ -81,7 +82,7 @@ namespace AsuraEngine
LUAX_PREPARE(L, Thread);
state.Push(self->IsRunning());
- return 0;
+ return 1;
}
// thread:IsCurrent()
@@ -90,7 +91,7 @@ namespace AsuraEngine
LUAX_PREPARE(L, Thread);
state.Push(self->IsCurrent());
- return 0;
+ return 1;
}
// thread:GetName()
@@ -98,6 +99,20 @@ namespace AsuraEngine
{
LUAX_PREPARE(L, Thread);
+ state.Push(self->GetName());
+ return 1;
+ }
+
+ // Thread.Sleep(milliseconds)
+ LUAX_IMPL_METHOD(Thread, _Sleep)
+ {
+ LUAX_STATE(L);
+ int ms = state.CheckValue<int>(1);
+#if ASURA_THREAD_WIN32
+ ::Sleep(ms);
+#elif ASURA_THREAD_STD
+
+#endif
return 0;
}
diff --git a/source/libs/asura-lib-utils/threading/mutex.h b/source/libs/asura-lib-utils/threading/mutex.h
index 51fe63e..7e7d877 100644
--- a/source/libs/asura-lib-utils/threading/mutex.h
+++ b/source/libs/asura-lib-utils/threading/mutex.h
@@ -32,15 +32,15 @@ namespace AsuraEngine
};
- class Lock
+ class _mutex_locker
{
public:
- Lock(Mutex& mutex)
+ _mutex_locker(Mutex& mutex)
: m(mutex)
{
m.Lock();
};
- ~Lock()
+ ~_mutex_locker()
{
m.Unlock();
}
@@ -50,11 +50,11 @@ namespace AsuraEngine
};
// ڵջӴλÿʼջΪٽ
-#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)
-#define lock4(mutex) Lock _asura_scoped_lock_0x3_(mutex)
-#define lock5(mutex) Lock _asura_scoped_lock_0x4_(mutex)
+#define lock(mutex) _mutex_locker _asura_scoped_lock_0x0(mutex)
+#define lock2(mutex) _mutex_locker _asura_scoped_lock_0x1(mutex)
+#define lock3(mutex) _mutex_locker _asura_scoped_lock_0x2(mutex)
+#define lock4(mutex) _mutex_locker _asura_scoped_lock_0x3(mutex)
+#define lock5(mutex) _mutex_locker _asura_scoped_lock_0x4(mutex)
ASURA_ABSTRACT class MutexImpl
{
diff --git a/source/libs/asura-lib-utils/threading/task.cpp b/source/libs/asura-lib-utils/threading/task.cpp
index e69de29..2e84ed4 100644
--- a/source/libs/asura-lib-utils/threading/task.cpp
+++ b/source/libs/asura-lib-utils/threading/task.cpp
@@ -0,0 +1,12 @@
+#include "task.h"
+#include "../scripting/lua_env.h"
+
+using namespace AEScripting;
+
+namespace AsuraEngine
+{
+ namespace Threading
+ {
+
+ }
+}
diff --git a/source/libs/asura-lib-utils/threading/task.h b/source/libs/asura-lib-utils/threading/task.h
index 9f78860..9c0b12c 100644
--- a/source/libs/asura-lib-utils/threading/task.h
+++ b/source/libs/asura-lib-utils/threading/task.h
@@ -13,12 +13,12 @@ namespace AsuraEngine
/// ϣһ̴߳񣬼̳TaskдExecute
///
ASURA_ABSTRACT class Task
- : virtual public AEScripting::NativeAccessor
+ : public virtual AEScripting::NativeAccessor
{
public:
- Task();
- virtual ~Task();
+ Task() {};
+ virtual ~Task() {};
///
/// ִɺ󷵻trueûص
@@ -28,10 +28,11 @@ namespace AsuraEngine
///
/// ûص
///
- virtual void Invoke(lua_State* thread) = 0;
+ virtual void Invoke() = 0;
- protected:
+ protected:
+ // ȡص
Luax::LuaxMemberRef mCallback;
};
diff --git a/source/libs/asura-lib-utils/threading/thread.cpp b/source/libs/asura-lib-utils/threading/thread.cpp
index 51738de..9c71ace 100644
--- a/source/libs/asura-lib-utils/threading/thread.cpp
+++ b/source/libs/asura-lib-utils/threading/thread.cpp
@@ -13,9 +13,6 @@ namespace AsuraEngine
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()
@@ -79,13 +76,18 @@ namespace AsuraEngine
return mName;
}
- void Thread::Execute()
+ void Thread::Process()
{
+ LUAX_STATE(AEScripting::LuaEnv::Get()->GetMainState());
while (!mTaskQueue.empty())
{
Task* task = mTaskQueue.front();
- if (task->Execute())
- task->Invoke(mState);
+ if (task && task->Execute())
+ {
+ // unsafe
+ task->Invoke();
+ this->LuaxRelease<Task>(state, task);
+ }
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 1bd5f15..3fa079a 100644
--- a/source/libs/asura-lib-utils/threading/thread.h
+++ b/source/libs/asura-lib-utils/threading/thread.h
@@ -17,6 +17,28 @@ namespace AsuraEngine
class ThreadImpl;
///
+ /// ̵߳ļֲͬʵ֣
+ /// 1: Deferredӳģʽ߳ϵɺҪ̵ֶ߳Post
+ /// ̵߳ص첽Ϊͬlua_Stateͻ⡣
+ /// 2: Immediateģʽÿһ߳άһlua_newthreadlua_State
+ /// صڲͬlua_Stateеãⲻ̷ͬ߳ͬһlua_State
+ /// 3: Daemonػģʽ̻߳һֱں̨
+ ///
+ enum ThreadType
+ {
+ THREAD_TYPE_DEFERRED,
+ THREAD_TYPE_IMMEDIATE,
+ THREAD_TYPE_DAEMON
+ };
+
+ enum ThreadState
+ {
+ THREAD_STATE_RUNNING,
+ THREAD_STATE_DEAD,
+ THREAD_STATE_SUSPEND,
+ };
+
+ ///
/// ߳壬ÿ߳άһtask queue
///
class Thread ASURA_FINAL
@@ -26,7 +48,7 @@ namespace AsuraEngine
LUAX_DECL_FACTORY(Thread);
- Thread(Luax::LuaxState& father, const std::string& name = "");
+ Thread(ThreadType type, Luax::LuaxState& luaThread, const std::string& name = "");
~Thread();
bool AddTask(Task* task);
@@ -34,8 +56,10 @@ namespace AsuraEngine
void Start(uint32 stacksize = 0);
///
- /// ǿֹ̡߳עҪnewdeleteִ֮TerminateThread򽫲ڼʹnewˡ
+ /// ǿֹ̡߳עҪnewdeleteִ֮TerminateThread򽫲ڼ
+ /// ʹnewˡ
/// https://blog.csdn.net/anye3000/article/details/7470674
+ /// ע⣺ҪʹӿڣӦ߳Լеյ㣬ֶر
///
void Kill();
@@ -51,12 +75,21 @@ namespace AsuraEngine
///
/// ִС
///
- void Execute();
+ void Process();
const std::string& GetName();
+ ///
+ /// ص
+ ///
+ void Post();
+
private:
+ //----------------------------------------------------------------------------//
+
+ LUAX_DECL_ENUM(ThreadType);
+
LUAX_DECL_METHOD(_New);
LUAX_DECL_METHOD(_Start);
LUAX_DECL_METHOD(_Join);
@@ -65,6 +98,10 @@ namespace AsuraEngine
LUAX_DECL_METHOD(_IsRunning);
LUAX_DECL_METHOD(_IsCurrent);
LUAX_DECL_METHOD(_GetName);
+ LUAX_DECL_METHOD(_Sleep);
+ LUAX_DECL_METHOD(_Post);
+
+ //----------------------------------------------------------------------------//
ThreadImpl* mImpl;
std::string mName;
@@ -75,11 +112,10 @@ namespace AsuraEngine
std::queue<Task*> mTaskQueue;
Mutex mMutex;
- ///
- /// ̵߳luaִջΪ˱ִջͻ
- ///
- lua_State* mState;
- Luax::LuaxMemberRef mStateRef;
+ lua_State* mLuaThread;
+
+ std::queue<Task*> mFinishedTasks;
+ Mutex mFinishedMutex;
};
diff --git a/source/libs/asura-lib-utils/threading/thread_impl_posix.cpp b/source/libs/asura-lib-utils/threading/thread_impl_posix.cpp
index e69de29..d2ad7af 100644
--- a/source/libs/asura-lib-utils/threading/thread_impl_posix.cpp
+++ b/source/libs/asura-lib-utils/threading/thread_impl_posix.cpp
@@ -0,0 +1,9 @@
+#include "thread_impl_posix.h"
+
+namespace AsuraEngine
+{
+ namespace Threading
+ {
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/threading/thread_impl_win32.cpp b/source/libs/asura-lib-utils/threading/thread_impl_win32.cpp
index fd1b066..ad859b6 100644
--- a/source/libs/asura-lib-utils/threading/thread_impl_win32.cpp
+++ b/source/libs/asura-lib-utils/threading/thread_impl_win32.cpp
@@ -1,6 +1,8 @@
#include "thread_impl_win32.h"
#include "thread.h"
+#include <iostream>
+
namespace AsuraEngine
{
namespace Threading
@@ -9,7 +11,11 @@ namespace AsuraEngine
static DWORD WINAPI _thread_win32_runner(LPVOID param)
{
Thread* thread = (Thread*)param;
- thread->Execute();
+ while (thread->IsRunning())
+ {
+ thread->Process();
+ ::Sleep(100);
+ }
return 0;
}
diff --git a/source/libs/asura-lib-utils/threading/thread_task.cpp b/source/libs/asura-lib-utils/threading/thread_task.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-utils/threading/thread_task.cpp
diff --git a/source/libs/asura-lib-utils/threading/thread_task.h b/source/libs/asura-lib-utils/threading/thread_task.h
new file mode 100644
index 0000000..1ea0a1a
--- /dev/null
+++ b/source/libs/asura-lib-utils/threading/thread_task.h
@@ -0,0 +1,44 @@
+#ifndef __ASURA_THRAD_TASK_H__
+#define __ASURA_THRAD_TASK_H__
+
+#include <asura-lib-utils/type.h>
+#include <asura-lib-utils/scripting/portable.hpp>
+
+namespace AsuraEngine
+{
+ namespace Threading
+ {
+
+ ///
+ /// ϣһ̴߳񣬼̳TaskдExecute
+ ///
+ ASURA_ABSTRACT class ThreadTask
+ : virtual public AEScripting::NativeAccessor
+ {
+ public:
+
+ ThreadTask();
+ virtual ~ThreadTask();
+
+ ///
+ /// ִɺ󷵻trueûص
+ ///
+ virtual bool Execute() = 0;
+
+ ///
+ /// ûص
+ ///
+ virtual void Invoke() = 0;
+
+ protected:
+
+ Luax::LuaxMemberRef mCallback;
+
+ };
+
+ }
+}
+
+namespace AEThreading = AsuraEngine::Threading;
+
+#endif \ No newline at end of file