diff options
author | chai <chaifix@163.com> | 2019-03-30 11:59:35 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2019-03-30 11:59:35 +0800 |
commit | c270d033fa04873ee7a8925dbb00cae5edc4555c (patch) | |
tree | ee27a45c5b946b08dd7a726a925028f6ca3eabf1 | |
parent | 771df5c31cd5653467fd6e76c1a3e002ca39582c (diff) |
*misc
54 files changed, 575 insertions, 358 deletions
diff --git a/bin/win64/05-physfs.exe b/bin/win64/05-physfs.exe Binary files differindex 78353c7..4686084 100644 --- a/bin/win64/05-physfs.exe +++ b/bin/win64/05-physfs.exe diff --git a/build/modules/asura-core/asura-core.vcxproj b/build/modules/asura-core/asura-core.vcxproj index c01c3db..07c9dd9 100644 --- a/build/modules/asura-core/asura-core.vcxproj +++ b/build/modules/asura-core/asura-core.vcxproj @@ -156,6 +156,8 @@ <ClCompile Include="..\..\..\source\modules\asura-core\input\keyboard.cpp" /> <ClCompile Include="..\..\..\source\modules\asura-core\input\mouse.cpp" /> <ClCompile Include="..\..\..\source\modules\asura-core\profiler\stats.cpp" /> + <ClCompile Include="..\..\..\source\modules\asura-core\threading\channel.cpp" /> + <ClCompile Include="..\..\..\source\modules\asura-core\threading\thread_ex.cpp" /> <ClCompile Include="..\..\..\source\modules\asura-core\time\timer.cpp" /> <ClCompile Include="..\..\..\source\modules\asura-core\window\window.cpp" /> <ClCompile Include="..\..\..\source\modules\asura-core\window\window_impl_glew.cpp" /> @@ -202,6 +204,8 @@ <ClInclude Include="..\..\..\source\modules\asura-core\input\keyboard.h" /> <ClInclude Include="..\..\..\source\modules\asura-core\input\mouse.h" /> <ClInclude Include="..\..\..\source\modules\asura-core\profiler\stats.h" /> + <ClInclude Include="..\..\..\source\modules\asura-core\threading\channel.h" /> + <ClInclude Include="..\..\..\source\modules\asura-core\threading\thread_ex.h" /> <ClInclude Include="..\..\..\source\modules\asura-core\time\timer.h" /> <ClInclude Include="..\..\..\source\modules\asura-core\type.h" /> <ClInclude Include="..\..\..\source\modules\asura-core\window\window.h" /> diff --git a/build/modules/asura-core/asura-core.vcxproj.filters b/build/modules/asura-core/asura-core.vcxproj.filters index 5bbd204..8c3f7e1 100644 --- a/build/modules/asura-core/asura-core.vcxproj.filters +++ b/build/modules/asura-core/asura-core.vcxproj.filters @@ -22,6 +22,9 @@ <Filter Include="window"> <UniqueIdentifier>{7a73607c-8da6-4865-a992-5c7c8764bd5a}</UniqueIdentifier> </Filter> + <Filter Include="threading"> + <UniqueIdentifier>{05477a0e-f70b-4606-ae96-82ef7a7b8a1d}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\..\..\source\modules\asura-core\application.cpp" /> @@ -152,6 +155,12 @@ <ClCompile Include="..\..\..\source\modules\asura-core\window\window_impl_sdl.cpp"> <Filter>window</Filter> </ClCompile> + <ClCompile Include="..\..\..\source\modules\asura-core\threading\thread_ex.cpp"> + <Filter>threading</Filter> + </ClCompile> + <ClCompile Include="..\..\..\source\modules\asura-core\threading\channel.cpp"> + <Filter>threading</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\..\..\source\modules\asura-core\application.h" /> @@ -281,6 +290,12 @@ <ClInclude Include="..\..\..\source\modules\asura-core\window\window_impl_glut.h"> <Filter>window</Filter> </ClInclude> + <ClInclude Include="..\..\..\source\modules\asura-core\threading\thread_ex.h"> + <Filter>threading</Filter> + </ClInclude> + <ClInclude Include="..\..\..\source\modules\asura-core\threading\channel.h"> + <Filter>threading</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <None Include="..\..\..\source\modules\asura-core\font\string.inl"> diff --git a/build/modules/asura-utils/asura-utils.vcxproj b/build/modules/asura-utils/asura-utils.vcxproj index f3227f6..cc67004 100644 --- a/build/modules/asura-utils/asura-utils.vcxproj +++ b/build/modules/asura-utils/asura-utils.vcxproj @@ -146,6 +146,7 @@ <ClCompile Include="..\..\..\source\modules\asura-utils\stringmap.cpp" /> <ClCompile Include="..\..\..\source\modules\asura-utils\threading\binding\_coroutine.cpp" /> <ClCompile Include="..\..\..\source\modules\asura-utils\threading\binding\_thread.cpp" /> + <ClCompile Include="..\..\..\source\modules\asura-utils\threading\conditional.cpp" /> <ClCompile Include="..\..\..\source\modules\asura-utils\threading\coroutine.cpp" /> <ClCompile Include="..\..\..\source\modules\asura-utils\threading\mutex.cpp" /> <ClCompile Include="..\..\..\source\modules\asura-utils\threading\semaphore.cpp" /> @@ -181,13 +182,14 @@ <ClInclude Include="..\..\..\source\modules\asura-utils\math\vector3.hpp" /> <ClInclude Include="..\..\..\source\modules\asura-utils\math\vector4.h" /> <ClInclude Include="..\..\..\source\modules\asura-utils\module.h" /> - <ClInclude Include="..\..\..\source\modules\asura-utils\scripting\lua_env.h" /> <ClInclude Include="..\..\..\source\modules\asura-utils\scripting\portable.hpp" /> <ClInclude Include="..\..\..\source\modules\asura-utils\singleton.hpp" /> <ClInclude Include="..\..\..\source\modules\asura-utils\stringmap.hpp" /> + <ClInclude Include="..\..\..\source\modules\asura-utils\threading\conditional.h" /> <ClInclude Include="..\..\..\source\modules\asura-utils\threading\coroutine.h" /> <ClInclude Include="..\..\..\source\modules\asura-utils\threading\mutex.h" /> <ClInclude Include="..\..\..\source\modules\asura-utils\threading\semaphore.h" /> + <ClInclude Include="..\..\..\source\modules\asura-utils\threading\threadable.h" /> <ClInclude Include="..\..\..\source\modules\asura-utils\threading\thread.h" /> <ClInclude Include="..\..\..\source\modules\asura-utils\threading\thread_impl_posix.h" /> <ClInclude Include="..\..\..\source\modules\asura-utils\threading\thread_impl_sdl.h" /> diff --git a/build/modules/asura-utils/asura-utils.vcxproj.filters b/build/modules/asura-utils/asura-utils.vcxproj.filters index fd4711c..8534675 100644 --- a/build/modules/asura-utils/asura-utils.vcxproj.filters +++ b/build/modules/asura-utils/asura-utils.vcxproj.filters @@ -125,6 +125,9 @@ <ClCompile Include="..\..\..\source\modules\asura-utils\io\io_batch_task.cpp"> <Filter>io</Filter> </ClCompile> + <ClCompile Include="..\..\..\source\modules\asura-utils\threading\conditional.cpp"> + <Filter>threading</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\..\..\source\modules\asura-utils\exceptions\exception.h"> @@ -216,9 +219,6 @@ <ClInclude Include="..\..\..\source\modules\asura-utils\math\quaternion.h"> <Filter>math</Filter> </ClInclude> - <ClInclude Include="..\..\..\source\modules\asura-utils\scripting\lua_env.h"> - <Filter>scripting</Filter> - </ClInclude> <ClInclude Include="..\..\..\source\modules\asura-utils\threading\task.h"> <Filter>threading</Filter> </ClInclude> @@ -231,6 +231,12 @@ <ClInclude Include="..\..\..\source\modules\asura-utils\io\io_batch_task.h"> <Filter>io</Filter> </ClInclude> + <ClInclude Include="..\..\..\source\modules\asura-utils\threading\threadable.h"> + <Filter>threading</Filter> + </ClInclude> + <ClInclude Include="..\..\..\source\modules\asura-utils\threading\conditional.h"> + <Filter>threading</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <None Include="..\..\..\source\modules\asura-utils\math\rect.inl"> diff --git a/build/tests/03-openal/03-openal.vcxproj b/build/tests/03-openal/03-openal.vcxproj index 0795211..626e0ad 100644 --- a/build/tests/03-openal/03-openal.vcxproj +++ b/build/tests/03-openal/03-openal.vcxproj @@ -115,6 +115,7 @@ </Link> </ItemDefinitionGroup> <ItemGroup> + <ClCompile Include="..\..\..\source\tests\03-openal\main.cpp" /> </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> diff --git a/build/tests/03-openal/03-openal.vcxproj.filters b/build/tests/03-openal/03-openal.vcxproj.filters index 3c6f4fd..352d4eb 100644 --- a/build/tests/03-openal/03-openal.vcxproj.filters +++ b/build/tests/03-openal/03-openal.vcxproj.filters @@ -1,17 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> - <Filter Include="源文件"> - <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> - <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> - </Filter> - <Filter Include="头文件"> - <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> - <Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions> - </Filter> - <Filter Include="资源文件"> - <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> - <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> - </Filter> + <ClCompile Include="..\..\..\source\tests\03-openal\main.cpp" /> </ItemGroup> </Project>
\ No newline at end of file diff --git a/build/x64/Debug/03-openal.exe b/build/x64/Debug/03-openal.exe Binary files differnew file mode 100644 index 0000000..9a535ec --- /dev/null +++ b/build/x64/Debug/03-openal.exe diff --git a/source/3rd-party/Luax/luax_class.hpp b/source/3rd-party/Luax/luax_class.hpp index 257e1ca..bfb1a4d 100644 --- a/source/3rd-party/Luax/luax_class.hpp +++ b/source/3rd-party/Luax/luax_class.hpp @@ -177,8 +177,6 @@ namespace Luax /// LuaxWeakRef mUserdata; - public: - // LUAX_DECL_METHOD( _Tostring ); LUAX_DECL_METHOD( l_GetClass ); diff --git a/source/3rd-party/Luax/luax_vm.cpp b/source/3rd-party/Luax/luax_vm.cpp index 5e9d1f5..4dc7e0c 100644 --- a/source/3rd-party/Luax/luax_vm.cpp +++ b/source/3rd-party/Luax/luax_vm.cpp @@ -58,6 +58,11 @@ namespace Luax return mMainThread; } + LuaxState LuaxVM::GetMainState() + { + return mMainThread; + } + LuaxRefTable& LuaxVM::GetStrongRefTable() { return mStrongRefTable; diff --git a/source/3rd-party/Luax/luax_vm.h b/source/3rd-party/Luax/luax_vm.h index 1bac71e..3eda3f8 100644 --- a/source/3rd-party/Luax/luax_vm.h +++ b/source/3rd-party/Luax/luax_vm.h @@ -35,6 +35,7 @@ namespace Luax lua_State* GetMainThread(); lua_State* CreateThread(); + LuaxState GetMainState(); LuaxRefTable& GetStrongRefTable(); LuaxRefTable& GetWeakRefTable(); diff --git a/source/modules/asura-core/application.h b/source/modules/asura-core/application.h index 2285430..ccb39d7 100644 --- a/source/modules/asura-core/application.h +++ b/source/modules/asura-core/application.h @@ -32,7 +32,7 @@ namespace AsuraEngine /// /// ѭ /// - ASURA_ABSTRACT class Application + class Application { public: @@ -69,7 +69,7 @@ namespace AsuraEngine /// lua̫ʹˡC++дȻעһصһ̴߳lua_Stateעắִк /// ̵߳lua_Stateֻ֤һnativeʵ֮һlua_State /// - lua_State* mMainLuaState; + Luax::LuaxVM* mVM; /// /// Asura libsᰴն˳ʼ˳ʱִ˳ diff --git a/source/modules/asura-core/core_module.cpp b/source/modules/asura-core/core_module.cpp index e69de29..6f484c0 100644 --- a/source/modules/asura-core/core_module.cpp +++ b/source/modules/asura-core/core_module.cpp @@ -0,0 +1,19 @@ +#include "core_module.h" + +using namespace AEThreading; + +namespace AsuraEngine +{ + + void CoreModule::Initialize(Luax::LuaxState& state) + { + // Threading + LUAX_REGISTER_FACTORY(state, ThreadEx); + } + + void CoreModule::Finalize(Luax::LuaxState& state) + { + + } + +}
\ No newline at end of file diff --git a/source/modules/asura-core/core_module.h b/source/modules/asura-core/core_module.h index 2cded93..a295b18 100644 --- a/source/modules/asura-core/core_module.h +++ b/source/modules/asura-core/core_module.h @@ -1,10 +1,22 @@ #ifndef __ASURA_CORE_MODULE_H__ #define __ASURA_CORE_MODULE_H__ +#include <asura-utils/module.h> + +#include "threading/thread_ex.h" + namespace AsuraEngine { - + class CoreModule : public Module + { + public: + + void Initialize(Luax::LuaxState& state) override; + + void Finalize(Luax::LuaxState& state) override; + + }; } diff --git a/source/modules/asura-core/threading/coroutine.cpp b/source/modules/asura-core/threading/channel.cpp index e69de29..e69de29 100644 --- a/source/modules/asura-core/threading/coroutine.cpp +++ b/source/modules/asura-core/threading/channel.cpp diff --git a/source/modules/asura-core/threading/channel.h b/source/modules/asura-core/threading/channel.h new file mode 100644 index 0000000..edcd8cb --- /dev/null +++ b/source/modules/asura-core/threading/channel.h @@ -0,0 +1,19 @@ +#ifndef __ASURA_THREAD_CHANNEL_H__ +#define __ASURA_THREAD_CHANNEL_H__ + +#include <asura-utils/scripting/portable.hpp> + +namespace AsuraEngine +{ + namespace Threading + { + + class Channel + { + + }; + + } +} + +#endif
\ No newline at end of file diff --git a/source/modules/asura-core/threading/coroutine.h b/source/modules/asura-core/threading/coroutine.h deleted file mode 100644 index 1ac6b21..0000000 --- a/source/modules/asura-core/threading/coroutine.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef __ASURA_COROUTINE_H__ -#define __ASURA_COROUTINE_H__ - -#include <asura-lib-utils/scripting/portable.hpp> - -namespace AsuraEngine -{ - namespace Threading - { - - /// - /// luaЭ̣һЩ - /// - class Coroutine ASURA_FINAL - : public AEScripting::Portable<Coroutine> - { - public: - - LUAX_DECL_FACTORY(Coroutine); - - private: - - LUAX_DECL_METHOD(_New); - LUAX_DECL_METHOD(_Run); - - }; - - } -} - -#endif
\ No newline at end of file diff --git a/source/modules/asura-core/threading/thread.cpp b/source/modules/asura-core/threading/thread.cpp deleted file mode 100644 index e69de29..0000000 --- a/source/modules/asura-core/threading/thread.cpp +++ /dev/null diff --git a/source/modules/asura-core/threading/thread.h b/source/modules/asura-core/threading/thread.h deleted file mode 100644 index f4d3b48..0000000 --- a/source/modules/asura-core/threading/thread.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef __ASURA_THREAD_H__ -#define __ASURA_THREAD_H__ - -#include <queue> -#include <asura-lib-utils/scripting/portable.hpp> - -#include "thread_task.h" - -namespace AsuraEngine -{ - namespace Threading - { - - /// - /// ̵߳ľʵ֣ûģһֲԣ - /// 1: win32 - /// 2: posix - /// 3: SDL - /// 4: std::thread - /// - ASURA_ABSTRACT class ThreadImpl - { - public: - - }; - - /// - /// ߳壬ÿ߳άһtask queue - /// - class Thread ASURA_FINAL - : public AEScripting::Portable<Thread> - { - public: - - LUAX_DECL_FACTORY(Thread); - - bool Enqueue(ThreadTask* task); - - private: - - /// - /// С - /// - std::queue<ThreadTask*> mTaskQueue; - - ThreadImpl* mImpl; - - }; - - } -} - -#endif
\ No newline at end of file diff --git a/source/modules/asura-core/threading/thread_ex.cpp b/source/modules/asura-core/threading/thread_ex.cpp new file mode 100644 index 0000000..18b9fc7 --- /dev/null +++ b/source/modules/asura-core/threading/thread_ex.cpp @@ -0,0 +1,19 @@ +#include "thread_ex.h" + +namespace AsuraEngine +{ + namespace Threading + { + + void ThreadEx::Process() + { + + } + + void ThreadEx::RegisterModules() + { + + } + + } +}
\ No newline at end of file diff --git a/source/modules/asura-core/threading/thread_ex.h b/source/modules/asura-core/threading/thread_ex.h new file mode 100644 index 0000000..9f63034 --- /dev/null +++ b/source/modules/asura-core/threading/thread_ex.h @@ -0,0 +1,54 @@ +#ifndef __ASURA_THREAD_EX_H__ +#define __ASURA_THREAD_EX_H__ + +#include <asura-utils/scripting/portable.hpp> +#include <asura-utils/threading/thread.h> + +namespace AsuraEngine +{ + namespace Threading + { + + /// + /// ThreadExеͬͨ˶ͨݡ + /// + class ThreadEx ASURA_FINAL + : public AEScripting::Portable<ThreadEx> + , public Threadable + { + public: + + LUAX_DECL_FACTORY(ThreadEx); + + ThreadEx(); + ~ThreadEx(); + + int Process() override; + + private: + + //----------------------------------------------------------------------------// + + LUAX_DECL_METHOD(_New); + + //----------------------------------------------------------------------------// + + /// + /// ̵߳עAsuraͽӿڣעֻһֶ֮䴫ݡ + /// Щ͵Ķ + /// + void RegisterModules(); + + ThreadImpl* mImpl; + + /// + /// ̴߳ + /// + Luax::LuaxVM* mVM; + + }; + + } +} + +#endif
\ No newline at end of file diff --git a/source/modules/asura-core/threading/thread_impl_posix.cpp b/source/modules/asura-core/threading/thread_impl_posix.cpp deleted file mode 100644 index e69de29..0000000 --- a/source/modules/asura-core/threading/thread_impl_posix.cpp +++ /dev/null diff --git a/source/modules/asura-core/threading/thread_impl_posix.h b/source/modules/asura-core/threading/thread_impl_posix.h deleted file mode 100644 index e69de29..0000000 --- a/source/modules/asura-core/threading/thread_impl_posix.h +++ /dev/null diff --git a/source/modules/asura-core/threading/thread_impl_sdl.cpp b/source/modules/asura-core/threading/thread_impl_sdl.cpp deleted file mode 100644 index e69de29..0000000 --- a/source/modules/asura-core/threading/thread_impl_sdl.cpp +++ /dev/null diff --git a/source/modules/asura-core/threading/thread_impl_sdl.h b/source/modules/asura-core/threading/thread_impl_sdl.h deleted file mode 100644 index e69de29..0000000 --- a/source/modules/asura-core/threading/thread_impl_sdl.h +++ /dev/null diff --git a/source/modules/asura-core/threading/thread_impl_std.cpp b/source/modules/asura-core/threading/thread_impl_std.cpp deleted file mode 100644 index e69de29..0000000 --- a/source/modules/asura-core/threading/thread_impl_std.cpp +++ /dev/null diff --git a/source/modules/asura-core/threading/thread_impl_std.h b/source/modules/asura-core/threading/thread_impl_std.h deleted file mode 100644 index e69de29..0000000 --- a/source/modules/asura-core/threading/thread_impl_std.h +++ /dev/null diff --git a/source/modules/asura-core/threading/thread_impl_win32.cpp b/source/modules/asura-core/threading/thread_impl_win32.cpp deleted file mode 100644 index e69de29..0000000 --- a/source/modules/asura-core/threading/thread_impl_win32.cpp +++ /dev/null diff --git a/source/modules/asura-core/threading/thread_impl_win32.h b/source/modules/asura-core/threading/thread_impl_win32.h deleted file mode 100644 index 5d854cc..0000000 --- a/source/modules/asura-core/threading/thread_impl_win32.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef __ASURA_THREAD_WIN32_H__ -#define __ASURA_THREAD_WIN32_H__ - -#include "../core_config.h" - -#include "thread.h" - -#if ASURA_THREAD_WIN32 - -namespace AsuraEngine -{ - namespace Threading - { - - class ThreadImplWin32 : public ThreadImpl - { - - }; - - } -} - -#endif // #if ASURA_THREAD_WIN32 - -#endif
\ No newline at end of file diff --git a/source/modules/asura-core/threading/thread_task.cpp b/source/modules/asura-core/threading/thread_task.cpp deleted file mode 100644 index e69de29..0000000 --- a/source/modules/asura-core/threading/thread_task.cpp +++ /dev/null diff --git a/source/modules/asura-core/threading/thread_task.h b/source/modules/asura-core/threading/thread_task.h deleted file mode 100644 index 19eb113..0000000 --- a/source/modules/asura-core/threading/thread_task.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef __ASURA_THRAD_TASK_H__ -#define __ASURA_THRAD_TASK_H__ - -#include <asura-lib-utils/type.h> - -namespace AsuraEngine -{ - namespace Threading - { - - /// - /// ϣһ̴̳߳TaskдExecute - /// - ASURA_ABSTRACT class ThreadTask - { - public: - - virtual bool Execute() = 0; - - }; - - } -} - -#endif
\ No newline at end of file diff --git a/source/modules/asura-utils/io/binding/_data_buffer.cpp b/source/modules/asura-utils/io/binding/_data_buffer.cpp index cd73b31..ac240e5 100644 --- a/source/modules/asura-utils/io/binding/_data_buffer.cpp +++ b/source/modules/asura-utils/io/binding/_data_buffer.cpp @@ -10,12 +10,13 @@ namespace AsuraEngine LUAX_REGISTRY(DataBuffer) { LUAX_REGISTER_METHODS(state, - { "New", _New }, - { "GetData", _GetData }, - { "GetSize", _GetSize }, - { "Refactor", _Refactor }, - { "Load", _Load }, - { "Clear", _Clear } + { "New", _New }, + { "GetData", _GetData }, + { "GetSize", _GetSize }, + { "GetCapacity", _GetCapacity }, + { "Refactor", _Refactor }, + { "Load", _Load }, + { "Clear", _Clear } ); } @@ -24,7 +25,7 @@ namespace AsuraEngine } // databuffer = DataBuffer.New(lstring) - // databuffer = DataBuffer.New(size) + // databuffer = DataBuffer.New(capacity) LUAX_IMPL_METHOD(DataBuffer, _New) { LUAX_STATE(L); @@ -39,8 +40,8 @@ namespace AsuraEngine } else if (state.IsType(1, LUA_TNUMBER)) { - size_t size = lua_tonumber(L, 1); - DataBuffer* buffer = new DataBuffer(size); + size_t capacity = lua_tonumber(L, 1); + DataBuffer* buffer = new DataBuffer(capacity); buffer->PushLuaxUserdata(state); return 1; } @@ -70,13 +71,23 @@ namespace AsuraEngine return 1; } - // databuffer:Refactor(size) + // capacity = databuffer:GetCapacity() + LUAX_IMPL_METHOD(DataBuffer, _GetCapacity) + { + LUAX_SETUP(L, "U"); + + DataBuffer* self = state.GetUserdata<DataBuffer>(1); + lua_pushinteger(L, self->GetCapacity()); + return 1; + } + + // databuffer:Refactor(capacity) LUAX_IMPL_METHOD(DataBuffer, _Refactor) { LUAX_PREPARE(L, DataBuffer); - size_t size = state.CheckValue<int>(2); - self->Refactor(size); + size_t capacity = state.CheckValue<int>(2); + self->Refactor(capacity); return 0; } @@ -92,16 +103,14 @@ namespace AsuraEngine if (state.IsType(2, LUA_TSTRING)) { data = lua_tolstring(L, 2, &size); - size_t len = buffer->Load(data, size); - state.Push(len); - return 1; + buffer->Load(data, size); + return 0; } else if(state.IsType(2, LUA_TUSERDATA)) { DataBuffer* src = state.CheckUserdata<DataBuffer>(2); - size_t len = buffer->Load(*src); - state.Push(len); - return 1; + buffer->Load(*src); + return 0; } else { diff --git a/source/modules/asura-utils/io/data_buffer.cpp b/source/modules/asura-utils/io/data_buffer.cpp index 5049b38..36e13c7 100644 --- a/source/modules/asura-utils/io/data_buffer.cpp +++ b/source/modules/asura-utils/io/data_buffer.cpp @@ -10,65 +10,109 @@ namespace AsuraEngine { DataBuffer::DataBuffer(DataBuffer& src) + : mSize(0) + , mCapacity(0) + , mBytes(nullptr) { - Load(src); + // ʼ + lock(mMutex) + { + mCapacity = src.mSize; + mBytes = new byte[mCapacity]; + Clear(); + + Load(src); + } } - DataBuffer::DataBuffer(std::size_t size) - : mSize(size) + DataBuffer::DataBuffer(std::size_t capacity) + : mSize(0) + , mCapacity(0) , mBytes(nullptr) { - lock(mMutex); - mBytes = new byte[size]; - memset(mBytes, 0, size); + lock(mMutex) + { + mCapacity = capacity; + mBytes = new byte[mCapacity]; + Clear(); + } } DataBuffer::DataBuffer(const void* data, std::size_t size) - : mSize(size) + : mCapacity(0) + , mSize(0) , mBytes(nullptr) { - Load(data, size); + lock(mMutex) + { + mCapacity = size; + mBytes = new byte[mCapacity]; + Clear(); + + Load(data, size); + } } DataBuffer::~DataBuffer() { - delete[] mBytes; + lock(mMutex) + { + delete[] mBytes; + } } - void DataBuffer::Refactor(size_t size) + void DataBuffer::Refactor(size_t capacity) { - lock(mMutex); - if (!mBytes || mSize != size) + lock(mMutex) { - delete[] mBytes; - mBytes = new byte[size]; - mSize = size; + if (!mBytes || mCapacity != capacity) + { + if(mBytes) + delete[] mBytes; + mCapacity = capacity; + mBytes = new byte[mCapacity]; + mSize = 0; + } + Clear(); } - memset(mBytes, 0, size * sizeof(byte)); } - size_t DataBuffer::Load(DataBuffer& db) + void DataBuffer::Load(DataBuffer& db) { - return Load(db.GetData(), db.GetSize()); + lock(mMutex) + { + Load(db.GetData(), db.GetSize()); + } } - size_t DataBuffer::Load(const void* data, std::size_t size) + void DataBuffer::Load(const void* data, std::size_t size) { - lock(mMutex); - size_t len = mSize > size ? size : mSize; - memcpy(mBytes, data, len); - return len; + lock(mMutex) + { + ASSERT(mCapacity >= size); + memcpy(mBytes, data, size); + mSize = size; + } } void DataBuffer::Move(void* bytes, std::size_t size) { - lock(mMutex); - if (!mBytes) + lock(mMutex) { - delete[] mBytes; + if (mBytes == bytes) + { + // sizeֵڶļʱ + mSize = size; + } + else + { + if (mBytes) + delete[] mBytes; + mBytes = (byte*)bytes; + mSize = size; + mCapacity = size; + } } - mBytes = (byte*)bytes; - mSize = size; } byte* DataBuffer::GetData() @@ -78,9 +122,14 @@ namespace AsuraEngine void DataBuffer::Clear() { - lock(mMutex); - if (mBytes) - memset(mBytes, 0, mSize); + lock(mMutex) + { + if (mBytes) + { + memset(mBytes, 0, mSize); + mSize = 0; + } + } } std::size_t DataBuffer::GetSize() @@ -88,6 +137,11 @@ namespace AsuraEngine return mSize; } + std::size_t DataBuffer::GetCapacity() + { + return mCapacity; + } + void DataBuffer::Lock() { mMutex.Lock(); diff --git a/source/modules/asura-utils/io/data_buffer.h b/source/modules/asura-utils/io/data_buffer.h index 445bdf4..61d158b 100644 --- a/source/modules/asura-utils/io/data_buffer.h +++ b/source/modules/asura-utils/io/data_buffer.h @@ -22,17 +22,33 @@ namespace AsuraEngine LUAX_DECL_FACTORY(DataBuffer); DataBuffer(DataBuffer& src); - DataBuffer(std::size_t size); + DataBuffer(std::size_t capacity); DataBuffer(const void* bytes, std::size_t size); ~DataBuffer(); byte* GetData(); size_t GetSize(); - - void Refactor(size_t size); - size_t Load(DataBuffer& db); - size_t Load(const void* bytes, std::size_t size); + size_t GetCapacity(); + + /// + /// + /// + void Refactor(size_t capacity); + + /// + /// Դ˻ + /// + void Load(DataBuffer& db); + void Load(const void* bytes, std::size_t size); + + /// + /// bytesӵȨcapacityΪsize + /// void Move(void* bytes, std::size_t size); + + /// + /// + /// void Clear(); void Lock(); @@ -40,14 +56,23 @@ namespace AsuraEngine private: + /// + /// Bufferַݵij + /// byte* mBytes; size_t mSize; + /// + /// Buffer + /// + size_t mCapacity; + AEThreading::Mutex mMutex; LUAX_DECL_METHOD(_New); LUAX_DECL_METHOD(_GetData); LUAX_DECL_METHOD(_GetSize); + LUAX_DECL_METHOD(_GetCapacity); LUAX_DECL_METHOD(_Refactor); LUAX_DECL_METHOD(_Load); LUAX_DECL_METHOD(_Clear); diff --git a/source/modules/asura-utils/io/file.cpp b/source/modules/asura-utils/io/file.cpp index ed95436..9e89c85 100644 --- a/source/modules/asura-utils/io/file.cpp +++ b/source/modules/asura-utils/io/file.cpp @@ -122,7 +122,7 @@ namespace AsuraEngine { ASSERT(dst); - if (dst->GetSize() < length) + if (dst->GetCapacity() < length) throw Exception("Data buffer is too small compares to read length."); if (!mFileHandle || mMode != FILE_MODE_READ) @@ -149,11 +149,13 @@ namespace AsuraEngine size_t length = PHYSFS_fileLength(mFileHandle); - if (dst->GetSize() < length) + if (dst->GetCapacity() < length) throw Exception("Data buffer is too small compares to file length."); dst->Lock(); - size_t size = PHYSFS_readBytes(mFileHandle, dst->GetData(), length); + byte* data = dst->GetData(); + size_t size = PHYSFS_readBytes(mFileHandle, data, length); + dst->Move(data, length); dst->Unlock(); return size; } diff --git a/source/modules/asura-utils/io/io_task.cpp b/source/modules/asura-utils/io/io_task.cpp index 361b9c5..5f0e1c8 100644 --- a/source/modules/asura-utils/io/io_task.cpp +++ b/source/modules/asura-utils/io/io_task.cpp @@ -43,9 +43,9 @@ namespace AsuraEngine if (mCallback) { LuaxScopedState state(invokeThreaad); - if (PushLuaxMemberRef(state, mCallback)) + if (this->PushLuaxMemberRef(state, mCallback)) { - PushLuaxMemberRef(state, mBufferRef); + this->PushLuaxMemberRef(state, mBufferRef); state.Call(1, 0); } } diff --git a/source/modules/asura-utils/scripting/lua_env.h b/source/modules/asura-utils/scripting/lua_env.h deleted file mode 100644 index e2fc4fc..0000000 --- a/source/modules/asura-utils/scripting/lua_env.h +++ /dev/null @@ -1,72 +0,0 @@ -#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 stateAsura˼ǣ߳άһluaӦ - /// Ҫڴlua߽߳ջ - /// - class LuaEnv ASURA_FINAL : public Singleton<LuaEnv> - { - public: - - LuaEnv() : mVM(0) {}; - ~LuaEnv() {}; - - /// - /// ִջ - /// - inline void Init() - { - ASSERT(!mVM); - mVM = new Luax::LuaxVM(); - ASSERT(mVM); - mVM->Setup(); - }; - - inline lua_State* GetMainThread() - { - return mVM->GetMainThread(); - }; - - inline void Exit() - { - delete mVM; - mVM = nullptr; - } - - private: - - /// - /// ̱߳һluaһAsuraԶֻһִ붼 - /// УֻһΡ߳\ִջӦglobal_Stateģ - /// - /// struct lua_State *mainthread; - /// - /// ʹlua_newstate()ᴴһһglobal_Stateṹһ - /// ߳lua_Stateءglobal_State̹߳˵һ - /// ߳lua_newstate()⣬߳lua_newthread() - /// - Luax::LuaxVM* mVM; - - }; - - } -} - -namespace AEScripting = AsuraEngine::Scripting; - -#endif
\ No newline at end of file diff --git a/source/modules/asura-utils/scripting/portable.hpp b/source/modules/asura-utils/scripting/portable.hpp index 5badf8d..ffed49e 100644 --- a/source/modules/asura-utils/scripting/portable.hpp +++ b/source/modules/asura-utils/scripting/portable.hpp @@ -1,10 +1,14 @@ #ifndef __ASURA_ENGINE_PORTABLE_H__ #define __ASURA_ENGINE_PORTABLE_H__ +extern "C" { +#include <lua51/lua.h> +#include <lua51/lualib.h> +#include <lua51/lauxlib.h> +} +#include <luax/luax.h> #include "../type.h" -#include "lua_env.h" - namespace AsuraEngine { namespace Scripting diff --git a/source/modules/asura-utils/threading/binding/_thread.cpp b/source/modules/asura-utils/threading/binding/_thread.cpp index a5aff03..ad2fb7f 100644 --- a/source/modules/asura-utils/threading/binding/_thread.cpp +++ b/source/modules/asura-utils/threading/binding/_thread.cpp @@ -23,7 +23,7 @@ namespace AsuraEngine { "IsStopped", _IsStopped }, { "IsCurrent", _IsCurrent }, { "Sleep", _Sleep }, - { "Post", _Post }, + { "Dispatch", _Dispatch }, { "GetName", _GetName }, { "GetType", _GetType }, { "GetState", _GetState } @@ -37,7 +37,7 @@ namespace AsuraEngine { "IMMEDIATE", THREAD_TYPE_IMMEDIATE } ); LUAX_REGISTER_ENUM(state, "EThreadState", - { "READY", THREAD_STATE_IDLE }, + { "IDLE", THREAD_STATE_IDLE }, { "RUNNING", THREAD_STATE_RUNNING }, { "PAUSED", THREAD_STATE_PAUSED }, { "STOPPED", THREAD_STATE_STOPPED } @@ -165,11 +165,11 @@ namespace AsuraEngine return 0; } - // thread:Post() - LUAX_IMPL_METHOD(Thread, _Post) + // thread:Dispatch() + LUAX_IMPL_METHOD(Thread, _Dispatch) { LUAX_PREPARE(L, Thread); - self->Post(); + self->Dispatch(); return 0; } diff --git a/source/modules/asura-utils/threading/conditional.cpp b/source/modules/asura-utils/threading/conditional.cpp new file mode 100644 index 0000000..eb26e82 --- /dev/null +++ b/source/modules/asura-utils/threading/conditional.cpp @@ -0,0 +1,86 @@ +#include "conditional.h" + +namespace AsuraEngine +{ + namespace Threading + { + + Conditional::Conditional() + : mWaiting(0) + , mSignals(0) + { + } + + Conditional::~Conditional() + { + } + + void Conditional::Signal() + { + mMutex.Lock(); + if (mWaiting > mSignals) + { + ++mSignals; + signal(mWaitSem); + mMutex.Unlock(); + wait(mDoneSem); + } + else + { + mMutex.Unlock(); + } + } + + void Conditional::Broadcast() + { + mMutex.Lock(); + if (mWaiting> mSignals) { + int i, num_waiting; + + num_waiting = (mWaiting - mSignals); + mSignals = mWaiting; + for (i = 0; i < num_waiting; ++i) { + signal(mWaitSem); + } + mMutex.Unlock(); + for (i = 0; i < num_waiting; ++i) { + wait(mDoneSem); + } + } + else { + mMutex.Unlock(); + } + + } + + bool Conditional::Wait(Mutex* mutex, int timeout /*= ASURA_MUTEX_MAXWAIT*/) + { + bool retval; + + mMutex.Lock(); + ++mWaiting; + mMutex.Unlock(); + + mutex->Unlock(); + + retval = wait(mWaitSem, timeout); + + mMutex.Lock(); + if (mSignals > 0) { + if (!retval) { + wait(mWaitSem); + } + signal(mDoneSem); + + --mSignals; + } + --mWaiting; + mMutex.Unlock(); + + mMutex.Lock(); + + return retval; + } + + } +}
\ No newline at end of file diff --git a/source/modules/asura-utils/threading/conditional.h b/source/modules/asura-utils/threading/conditional.h new file mode 100644 index 0000000..2f9633e --- /dev/null +++ b/source/modules/asura-utils/threading/conditional.h @@ -0,0 +1,41 @@ +#ifndef __ASURA_CONDITIONAL_H__ +#define __ASURA_CONDITIONAL_H__ + +#include "mutex.h" +#include "semaphore.h" + +namespace AsuraEngine +{ + namespace Threading + { + + /// + /// + /// + class Conditional + { + public: + + Conditional(); + ~Conditional(); + + void Signal(); + void Broadcast(); + bool Wait(Mutex* mutex, int timeout = ASURA_MUTEX_MAXWAIT); + + private: + + Mutex mMutex; + + Semaphore mWaitSem; + Semaphore mDoneSem; + + int mWaiting; + int mSignals; + + }; + + } +} + +#endif
\ No newline at end of file diff --git a/source/modules/asura-utils/threading/mutex.cpp b/source/modules/asura-utils/threading/mutex.cpp index ffe67f6..bd7d419 100644 --- a/source/modules/asura-utils/threading/mutex.cpp +++ b/source/modules/asura-utils/threading/mutex.cpp @@ -34,7 +34,8 @@ namespace AsuraEngine Mutex::~Mutex() { - delete mImpl; + if(mImpl) + delete mImpl; } void Mutex::Lock() @@ -92,7 +93,7 @@ namespace AsuraEngine void MutexImplWin32_KM::Lock() { - ::WaitForSingleObject(mHandle, INFINITE); + ::WaitForSingleObject(mHandle, ASURA_MUTEX_MAXWAIT); } void MutexImplWin32_KM::Unlock() @@ -103,4 +104,4 @@ namespace AsuraEngine #endif // ASURA_MUTEX_WIN32_KERNAL_MUTEX } -} +}
\ No newline at end of file diff --git a/source/modules/asura-utils/threading/mutex.h b/source/modules/asura-utils/threading/mutex.h index a3fbea5..7afbe35 100644 --- a/source/modules/asura-utils/threading/mutex.h +++ b/source/modules/asura-utils/threading/mutex.h @@ -14,6 +14,8 @@ namespace AsuraEngine namespace Threading { +#define ASURA_MUTEX_MAXWAIT (~(uint32)0) + class MutexImpl; class Mutex @@ -44,17 +46,15 @@ namespace AsuraEngine { m.Unlock(); } + operator bool() { return false; }; private: void* operator new(size_t); Mutex& m; }; // ڵջӴλÿʼջΪٽ -#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) +#define lock(m) \ + if(_mutex_locker _asura_mutex_locker = m){} else ASURA_ABSTRACT class MutexImpl { diff --git a/source/modules/asura-utils/threading/semaphore.cpp b/source/modules/asura-utils/threading/semaphore.cpp index 12d4aab..aa5d9dd 100644 --- a/source/modules/asura-utils/threading/semaphore.cpp +++ b/source/modules/asura-utils/threading/semaphore.cpp @@ -1,6 +1,7 @@ #include "../exceptions/exception.h" #include "../type.h" +#include "mutex.h" #include "semaphore.h" namespace AsuraEngine @@ -41,10 +42,10 @@ namespace AsuraEngine mImpl->Signal(); } - void Semaphore::Wait(int timeout) + bool Semaphore::Wait(int timeout /*= ASURA_MUTEX_MAXWAIT*/) { ASSERT(mImpl); - mImpl->Wait(timeout); + return mImpl->Wait(timeout); } #if ASURA_THREAD_WIN32 @@ -52,9 +53,13 @@ namespace AsuraEngine SemaphoreWin32::SemaphoreWin32(unsigned int init_value) : SemaphoreImpl(init_value) { - mSem = CreateSemaphore(NULL, init_value, UINT_MAX, NULL); + // UINT_MAX get error. + mSem = CreateSemaphore(NULL, init_value, INT_MAX, NULL); if (!mSem) - throw Exception("Cant use win32 semaphore."); + { + int errorCode = GetLastError(); + throw Exception("Cant use win32 semaphore. Error code: %d.", errorCode); + } } SemaphoreWin32::~SemaphoreWin32() @@ -72,14 +77,22 @@ namespace AsuraEngine bool SemaphoreWin32::Wait(int timeout) { int result; - result = WaitForSingleObject(mSem, timeout < 0 ? INFINITE : timeout); + result = WaitForSingleObject(mSem, timeout); if (result == WAIT_OBJECT_0) { InterlockedDecrement(&mCount); return true; } - else + else if(result == WAIT_TIMEOUT) + { + // ʱ return false; + } + else + { + // δ֪ + throw Exception("WaitForSingleObject() failed"); + } } #endif // ASURA_THREAD_WIN32 diff --git a/source/modules/asura-utils/threading/semaphore.h b/source/modules/asura-utils/threading/semaphore.h index 80773d8..1a4e3b7 100644 --- a/source/modules/asura-utils/threading/semaphore.h +++ b/source/modules/asura-utils/threading/semaphore.h @@ -25,7 +25,7 @@ namespace AsuraEngine ~Semaphore(); void Signal(); - void Wait(int timeout = 0); + bool Wait(int timeout = ASURA_MUTEX_MAXWAIT); private: SemaphoreImpl* mImpl; @@ -46,8 +46,8 @@ namespace AsuraEngine unsigned int mCount; }; -#define wait(sem) sem.Wait(); -#define signal(sem) sem.Signal(); +#define wait(sem, ...) sem.Wait(__VA_ARGS__) +#define signal(sem) sem.Signal() #if ASURA_THREAD_WIN32 diff --git a/source/modules/asura-utils/threading/task.cpp b/source/modules/asura-utils/threading/task.cpp index 2e84ed4..decb74c 100644 --- a/source/modules/asura-utils/threading/task.cpp +++ b/source/modules/asura-utils/threading/task.cpp @@ -1,5 +1,5 @@ #include "task.h" -#include "../scripting/lua_env.h" +#include "../scripting/portable.hpp" using namespace AEScripting; diff --git a/source/modules/asura-utils/threading/thread.cpp b/source/modules/asura-utils/threading/thread.cpp index 0f4f5da..fc397d2 100644 --- a/source/modules/asura-utils/threading/thread.cpp +++ b/source/modules/asura-utils/threading/thread.cpp @@ -41,8 +41,10 @@ namespace AsuraEngine bool Thread::AddTask(Task* task) { - lock(mTaskQueueMutex); - mTaskQueue.push(task); + lock(mTaskQueueMutex) + { + mTaskQueue.push(task); + } return true; } @@ -96,25 +98,31 @@ namespace AsuraEngine { ASSERT(mImpl); - lock(mStateMutex); - mState = THREAD_STATE_PAUSED; + lock(mStateMutex) + { + mState = THREAD_STATE_PAUSED; + } } void Thread::Resume() { ASSERT(mImpl); - lock(mStateMutex); - if(mState == THREAD_STATE_PAUSED) - mState = THREAD_STATE_RUNNING; + lock(mStateMutex) + { + if (mState == THREAD_STATE_PAUSED) + mState = THREAD_STATE_RUNNING; + } } void Thread::Stop() { ASSERT(mImpl); - lock(mStateMutex); - mState = THREAD_STATE_STOPPED; + lock(mStateMutex) + { + mState = THREAD_STATE_STOPPED; + } } void Thread::PauseSync() @@ -144,9 +152,10 @@ namespace AsuraEngine ThreadState Thread::GetState() { ThreadState state; - mStateMutex.Lock(); - state = mState; - mStateMutex.Unlock(); + lock(mStateMutex) + { + state = mState; + } return state; } @@ -183,7 +192,7 @@ namespace AsuraEngine return mName; } - void Thread::Process() + int Thread::Process() { LUAX_STATE(mLuaThread); @@ -203,6 +212,7 @@ namespace AsuraEngine } else if (mType == THREAD_TYPE_IMMEDIATE) { + // unsafe task->Invoke(mCallbackThread); this->LuaxRelease<Task>(state, task); } @@ -230,14 +240,17 @@ namespace AsuraEngine // ״̬ΪIdle Idle(); + + return 0; } /// /// ӳģʽص /// - void Thread::Post() + void Thread::Dispatch() { - ASSERT(mType == THREAD_TYPE_DEFERRED); + if (mType != THREAD_TYPE_DEFERRED) + return; LUAX_STATE(mLuaThread); while (!mFinishedTasks.empty()) diff --git a/source/modules/asura-utils/threading/thread.h b/source/modules/asura-utils/threading/thread.h index 340fca3..d365fd0 100644 --- a/source/modules/asura-utils/threading/thread.h +++ b/source/modules/asura-utils/threading/thread.h @@ -9,6 +9,7 @@ #include "task.h" #include "mutex.h" #include "semaphore.h" +#include "threadable.h" namespace AsuraEngine { @@ -19,7 +20,7 @@ namespace AsuraEngine /// /// ̵߳ļֲͬʵ֣ - /// 1: Deferredӳģʽ߳ϵɺҪ̵ֶ߳Post + /// 1: Deferredӳģʽ߳ϵɺҪ̵ֶ߳Dispatch /// ̵߳ص첽Ϊͬlua_Stateͻ⡣ /// 2: Immediateģʽÿһ߳άһlua_newthreadlua_State /// صڲͬlua_Stateеãⲻ̷ͬ߳ͬһlua_State @@ -27,7 +28,7 @@ namespace AsuraEngine enum ThreadType { THREAD_TYPE_DEFERRED, - THREAD_TYPE_IMMEDIATE, + THREAD_TYPE_IMMEDIATE, // unsafe }; enum ThreadState @@ -43,6 +44,7 @@ namespace AsuraEngine /// class Thread ASURA_FINAL : public AEScripting::Portable<Thread> + , public Threadable { public: @@ -102,14 +104,14 @@ namespace AsuraEngine /// /// ִС /// - void Process(); + int Process() override; const std::string& GetName(); /// /// ص /// - void Post(); + void Dispatch(); /// /// ߺ @@ -141,7 +143,7 @@ namespace AsuraEngine LUAX_DECL_METHOD(_IsStopped); LUAX_DECL_METHOD(_IsCurrent); LUAX_DECL_METHOD(_Sleep); - LUAX_DECL_METHOD(_Post); + LUAX_DECL_METHOD(_Dispatch); LUAX_DECL_METHOD(_GetName); LUAX_DECL_METHOD(_GetType); LUAX_DECL_METHOD(_GetState); @@ -149,14 +151,15 @@ namespace AsuraEngine //----------------------------------------------------------------------------// + ThreadImpl* mImpl; + + lua_State* mLuaThread; + /// /// ˴Ƿػģʽ /// bool mIsDaemon; - lua_State* mLuaThread; - - ThreadImpl* mImpl; std::string mName; ThreadType mType; uint mSleepTime; @@ -204,7 +207,7 @@ namespace AsuraEngine ThreadImpl() {}; virtual ~ThreadImpl() {}; - virtual bool Start(Thread* thread, uint32 stacksize = 0) = 0; + virtual bool Start(Threadable* thread, uint32 stacksize = 0) = 0; virtual void Join() = 0; virtual void Kill() = 0; diff --git a/source/modules/asura-utils/threading/thread_impl_std.h b/source/modules/asura-utils/threading/thread_impl_std.h index 0e7d3da..4cc5dfe 100644 --- a/source/modules/asura-utils/threading/thread_impl_std.h +++ b/source/modules/asura-utils/threading/thread_impl_std.h @@ -24,7 +24,7 @@ namespace AsuraEngine ThreadImplSTD(); ~ThreadImplSTD(); - bool Start(Thread* thread, uint32 stacksize) override; + bool Start(Threadable* thread, uint32 stacksize) override; void Join() override; void Kill() override; diff --git a/source/modules/asura-utils/threading/thread_impl_win32.cpp b/source/modules/asura-utils/threading/thread_impl_win32.cpp index 6871c2d..0e1569c 100644 --- a/source/modules/asura-utils/threading/thread_impl_win32.cpp +++ b/source/modules/asura-utils/threading/thread_impl_win32.cpp @@ -3,6 +3,8 @@ #include <iostream> +#if ASURA_THREAD_WIN32 + namespace AsuraEngine { namespace Threading @@ -10,9 +12,8 @@ namespace AsuraEngine static DWORD WINAPI _thread_win32_runner(LPVOID param) { - Thread* thread = (Thread*)param; - thread->Process(); - return 0; + Threadable* thread = (Threadable*)param; + return thread->Process(); // β } ThreadImplWin32::ThreadImplWin32() @@ -26,7 +27,7 @@ namespace AsuraEngine mHandle = 0; } - bool ThreadImplWin32::Start(Thread* thread, uint32 stacksize/*=0*/) + bool ThreadImplWin32::Start(Threadable* thread, uint32 stacksize/*=0*/) { assert(!IsRunning()); mHandle = ::CreateThread( @@ -73,4 +74,6 @@ namespace AsuraEngine } } -}
\ No newline at end of file +} + +#endif // ASURA_THREAD_WIN32
\ No newline at end of file diff --git a/source/modules/asura-utils/threading/thread_impl_win32.h b/source/modules/asura-utils/threading/thread_impl_win32.h index a22aeef..fdcfc2b 100644 --- a/source/modules/asura-utils/threading/thread_impl_win32.h +++ b/source/modules/asura-utils/threading/thread_impl_win32.h @@ -24,7 +24,7 @@ namespace AsuraEngine ThreadImplWin32(); ~ThreadImplWin32(); - bool Start(Thread* thread, uint32 stacksize) override; + bool Start(Threadable* thread, uint32 stacksize) override; void Join() override; void Kill() override; diff --git a/source/modules/asura-utils/threading/threadable.h b/source/modules/asura-utils/threading/threadable.h new file mode 100644 index 0000000..08f807d --- /dev/null +++ b/source/modules/asura-utils/threading/threadable.h @@ -0,0 +1,25 @@ +#ifndef __ASURA_THREADABLE_H__ +#define __ASURA_THREADABLE_H__ + +#include "../type.h" + +namespace AsuraEngine +{ + namespace Threading + { + + ASURA_ABSTRACT class Threadable + { + public: + + Threadable() {}; + virtual ~Threadable() {}; + + virtual int Process() = 0; + + }; + + } +} + +#endif
\ No newline at end of file diff --git a/source/tests/03-openal/main.cpp b/source/tests/03-openal/main.cpp new file mode 100644 index 0000000..58b3a83 --- /dev/null +++ b/source/tests/03-openal/main.cpp @@ -0,0 +1,7 @@ + + + +int main() +{ + +} diff --git a/source/tests/05-physfs/main.cpp b/source/tests/05-physfs/main.cpp index 0ddade0..f30a75b 100644 --- a/source/tests/05-physfs/main.cpp +++ b/source/tests/05-physfs/main.cpp @@ -26,19 +26,19 @@ function main() print(file:GetExtension()) print(file:GetName()) dst = DataBuffer.New(138567) - thread = Thread.New(EThreadType.DEFFERRED) + thread = Thread.New() local content = "" local cont = "ok" if true then local buff=DataBuffer.New(10) - print(buff:GetSize()) + print(buff:GetCapacity()) buff = nil - end + end local task = IOTask.New("root/physfs2.txt", dst, EIOTaskType.READ, function(db) function _r() print("test..............") local c = db:GetData() - print(#c) + print(c) end function err(msg) print(msg) @@ -51,15 +51,8 @@ function main() thread:Start() while true do - thread:Post() + thread:Dispatch() Thread.Sleep(100) - local a = io.read() - if a == "x" then - thread:Stop() - end - if thread:IsStopped() then - break - end end end @@ -76,9 +69,9 @@ int main(int argc, char* args[]) AsuraEngine::UtilsModule utils; // ÿһasuraһlua stateһһlua߳ - AEScripting::LuaEnv::Get()->Init(); - - LUAX_STATE(LuaEnv::Get()->GetMainThread()); + Luax::LuaxVM* vm = new Luax::LuaxVM(); + vm->Setup(); + Luax::LuaxState state = vm->GetMainState(); state.OpenLibs(); state.PushGlobalNamespace(); @@ -89,7 +82,7 @@ int main(int argc, char* args[]) state.DoString(code); - LuaEnv::Get()->Exit(); + delete vm; return 0; }
\ No newline at end of file |