summaryrefslogtreecommitdiff
path: root/source/libs
diff options
context:
space:
mode:
Diffstat (limited to 'source/libs')
-rw-r--r--source/libs/asura-lib-core/graphics/image_data.cpp4
-rw-r--r--source/libs/asura-lib-core/graphics/image_data.h22
-rw-r--r--source/libs/asura-lib-utils/io/io_task.cpp15
-rw-r--r--source/libs/asura-lib-utils/io/io_task.h8
-rw-r--r--source/libs/asura-lib-utils/scripting/lua_env.h56
-rw-r--r--source/libs/asura-lib-utils/scripting/portable.hpp7
-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
-rw-r--r--source/libs/asura-lib-utils/utils_config.h3
16 files changed, 218 insertions, 70 deletions
diff --git a/source/libs/asura-lib-core/graphics/image_data.cpp b/source/libs/asura-lib-core/graphics/image_data.cpp
index 28c706a..b79dfab 100644
--- a/source/libs/asura-lib-core/graphics/image_data.cpp
+++ b/source/libs/asura-lib-core/graphics/image_data.cpp
@@ -16,7 +16,7 @@ namespace AsuraEngine
new STBDecoder() // jpeg, tga, bmp
};
- ImageData::ImageData(const Filesystem::DataBuffer& buffer)
+ ImageData::ImageData(const IO::DataBuffer& buffer)
: DecodedData(buffer)
{
}
@@ -30,7 +30,7 @@ namespace AsuraEngine
///
/// ޷ɹ׳쳣
///
- void ImageData::Decode(const Filesystem::DataBuffer& buffer)
+ void ImageData::Decode(const IO::DataBuffer& buffer)
{
for (ImageDecoder* decoder : ImageDecoders)
{
diff --git a/source/libs/asura-lib-core/graphics/image_data.h b/source/libs/asura-lib-core/graphics/image_data.h
index 53a9e85..820e276 100644
--- a/source/libs/asura-lib-core/graphics/image_data.h
+++ b/source/libs/asura-lib-core/graphics/image_data.h
@@ -4,8 +4,9 @@
#include <list>
#include <asura-lib-utils/scripting/portable.hpp>
-#include <asura-lib-utils/filesystem/decoded_data.h>
-#include <asura-lib-utils/filesystem/data_buffer.h>
+#include <asura-lib-utils/io/decoded_data.h>
+#include <asura-lib-utils/io/data_buffer.h>
+#include <asura-lib-utils/threading/thread.h>
#include "pixel_format.h"
#include "color.h"
@@ -18,17 +19,22 @@ namespace AsuraEngine
class ImageDecoder;
class ImageData ASURA_FINAL
- : public Filesystem::DecodedData
+ : public AEIO::DecodedData
, public Scripting::Portable<ImageData>
{
public:
+ LUAX_DECL_FACTORY(ImageData);
+
///
/// ͼƬļϢʧܣ׳쳣
///
- ImageData(const Filesystem::DataBuffer& buffer);
+ ImageData(const AEIO::DataBuffer& buffer);
~ImageData();
+ void Load(const AEIO::DataBuffer& buffer);
+ void LoadAsync(const AEIO::DataBuffer& buffer, AEThreading::Thread* thread);
+
Color GetPixel(uint x, uint y);
uint width, height;
@@ -38,17 +44,13 @@ namespace AsuraEngine
private:
- void Decode(const Filesystem::DataBuffer& buffer) override;
+ void Decode(const AEIO::DataBuffer& buffer) override;
///
/// ڵһ׼image dataʱṩdecoderڼdecodersмѡԡ
///
static std::list<ImageDecoder*> ImageDecoders;
- public:
-
- LUAX_DECL_FACTORY(ImageData);
-
LUAX_DECL_METHOD(_New);
LUAX_DECL_METHOD(_GetPixel);
LUAX_DECL_METHOD(_GetSize);
@@ -61,4 +63,6 @@ namespace AsuraEngine
}
}
+namespace AEGraphics = AsuraEngine::Graphics;
+
#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/io/io_task.cpp b/source/libs/asura-lib-utils/io/io_task.cpp
index a96c293..1a50e56 100644
--- a/source/libs/asura-lib-utils/io/io_task.cpp
+++ b/source/libs/asura-lib-utils/io/io_task.cpp
@@ -1,5 +1,8 @@
#include "io_task.h"
+using namespace AEScripting;
+using namespace Luax;
+
namespace AsuraEngine
{
namespace IO
@@ -20,9 +23,17 @@ namespace AsuraEngine
return true;
}
- void IOTask::Invoke()
+ void IOTask::Invoke(lua_State* thread)
{
-
+ if (mCallback)
+ {
+ LuaxScopedState state(thread);
+ if (PushLuaxMemberRef(state, mCallback))
+ {
+ PushLuaxMemberRef(state, mDstRef);
+ state.Call(1, 0);
+ }
+ }
}
}
diff --git a/source/libs/asura-lib-utils/io/io_task.h b/source/libs/asura-lib-utils/io/io_task.h
index aa5b38e..a79b2a8 100644
--- a/source/libs/asura-lib-utils/io/io_task.h
+++ b/source/libs/asura-lib-utils/io/io_task.h
@@ -4,7 +4,7 @@
#include <string>
#include "../scripting/portable.hpp"
-#include "../threading/thread_task.h"
+#include "../threading/task.h"
#include "data_buffer.h"
@@ -18,7 +18,7 @@ namespace AsuraEngine
///
class IOTask ASURA_FINAL
: public AEScripting::Portable<IOTask>
- , public AEThreading::ThreadTask
+ , public AEThreading::Task
{
public:
@@ -28,13 +28,13 @@ namespace AsuraEngine
~IOTask();
bool Execute() override ;
- void Invoke() override;
+ void Invoke(lua_State* thread) override;
private:
std::string mPath;
- DataBuffer* mDst;
+ DataBuffer* mDst;
Luax::LuaxMemberRef mDstRef;
LUAX_DECL_METHOD(_New);
diff --git a/source/libs/asura-lib-utils/scripting/lua_env.h b/source/libs/asura-lib-utils/scripting/lua_env.h
new file mode 100644
index 0000000..a467479
--- /dev/null
+++ b/source/libs/asura-lib-utils/scripting/lua_env.h
@@ -0,0 +1,56 @@
+#ifndef __ASURA_LUA_ENV_H__
+#define __ASURA_LUA_ENV_H__
+
+extern "C"
+{
+#include <Lua51/lua.h>
+#include <Lua51/lauxlib.h>
+}
+#include <Luax/luax.h>
+
+#include "../singleton.hpp"
+
+namespace AsuraEngine
+{
+ namespace Scripting
+ {
+
+ ///
+ /// ͨӿڷlua state
+ ///
+ class LuaEnv ASURA_FINAL : public Singleton<LuaEnv>
+ {
+ public:
+
+ LuaEnv() : mMainState(0){};
+ ~LuaEnv() {};
+
+ ///
+ /// ִջ
+ ///
+ inline void Init(lua_State* L) { ASSERT(!mMainState); mMainState = L; };
+
+ inline lua_State* GetMainState() { return mMainState; };
+
+ private:
+
+ ///
+ /// ̱߳һluaһAsuraԶֻһ󲿷ִ붼УֻһΡ
+ /// ߳\ִջӦglobal_Stateģ
+ ///
+ /// struct lua_State *mainthread;
+ ///
+ /// ʹlua_newstate()ᴴһһglobal_Stateṹһ߳lua_Stateء
+ /// global_State̹߳˵һ߳lua_newstate()⣬߳lua_newthread()
+ ///
+ ///
+ lua_State* mMainState;
+
+ };
+
+ }
+}
+
+namespace AEScripting = AsuraEngine::Scripting;
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/scripting/portable.hpp b/source/libs/asura-lib-utils/scripting/portable.hpp
index 097a9fe..5badf8d 100644
--- a/source/libs/asura-lib-utils/scripting/portable.hpp
+++ b/source/libs/asura-lib-utils/scripting/portable.hpp
@@ -3,12 +3,7 @@
#include "../type.h"
-extern "C"
-{
- #include <Lua51/lua.h>
- #include <Lua51/lauxlib.h>
-}
-#include <Luax/luax.h>
+#include "lua_env.h"
namespace AsuraEngine
{
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;
};
diff --git a/source/libs/asura-lib-utils/utils_config.h b/source/libs/asura-lib-utils/utils_config.h
index d5208d5..02837dc 100644
--- a/source/libs/asura-lib-utils/utils_config.h
+++ b/source/libs/asura-lib-utils/utils_config.h
@@ -4,4 +4,7 @@
#define ASURA_THREAD_WIN32 1
#define ASURA_THREAD_STD 1
+#define ASURA_MUTEX_WIN32_CRITICLE_SECTION 1
+#define ASURA_MUTEX_WIN32_KERNAL_MUTEX 1
+
#endif \ No newline at end of file