summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-03-30 11:59:35 +0800
committerchai <chaifix@163.com>2019-03-30 11:59:35 +0800
commitc270d033fa04873ee7a8925dbb00cae5edc4555c (patch)
treeee27a45c5b946b08dd7a726a925028f6ca3eabf1
parent771df5c31cd5653467fd6e76c1a3e002ca39582c (diff)
*misc
-rw-r--r--bin/win64/05-physfs.exebin1208832 -> 1210880 bytes
-rw-r--r--build/modules/asura-core/asura-core.vcxproj4
-rw-r--r--build/modules/asura-core/asura-core.vcxproj.filters15
-rw-r--r--build/modules/asura-utils/asura-utils.vcxproj4
-rw-r--r--build/modules/asura-utils/asura-utils.vcxproj.filters12
-rw-r--r--build/tests/03-openal/03-openal.vcxproj1
-rw-r--r--build/tests/03-openal/03-openal.vcxproj.filters13
-rw-r--r--build/x64/Debug/03-openal.exebin0 -> 58368 bytes
-rw-r--r--source/3rd-party/Luax/luax_class.hpp2
-rw-r--r--source/3rd-party/Luax/luax_vm.cpp5
-rw-r--r--source/3rd-party/Luax/luax_vm.h1
-rw-r--r--source/modules/asura-core/application.h4
-rw-r--r--source/modules/asura-core/core_module.cpp19
-rw-r--r--source/modules/asura-core/core_module.h14
-rw-r--r--source/modules/asura-core/threading/channel.cpp (renamed from source/modules/asura-core/threading/coroutine.cpp)0
-rw-r--r--source/modules/asura-core/threading/channel.h19
-rw-r--r--source/modules/asura-core/threading/coroutine.h31
-rw-r--r--source/modules/asura-core/threading/thread.cpp0
-rw-r--r--source/modules/asura-core/threading/thread.h53
-rw-r--r--source/modules/asura-core/threading/thread_ex.cpp19
-rw-r--r--source/modules/asura-core/threading/thread_ex.h54
-rw-r--r--source/modules/asura-core/threading/thread_impl_posix.cpp0
-rw-r--r--source/modules/asura-core/threading/thread_impl_posix.h0
-rw-r--r--source/modules/asura-core/threading/thread_impl_sdl.cpp0
-rw-r--r--source/modules/asura-core/threading/thread_impl_sdl.h0
-rw-r--r--source/modules/asura-core/threading/thread_impl_std.cpp0
-rw-r--r--source/modules/asura-core/threading/thread_impl_std.h0
-rw-r--r--source/modules/asura-core/threading/thread_impl_win32.cpp0
-rw-r--r--source/modules/asura-core/threading/thread_impl_win32.h25
-rw-r--r--source/modules/asura-core/threading/thread_task.cpp0
-rw-r--r--source/modules/asura-core/threading/thread_task.h25
-rw-r--r--source/modules/asura-utils/io/binding/_data_buffer.cpp45
-rw-r--r--source/modules/asura-utils/io/data_buffer.cpp116
-rw-r--r--source/modules/asura-utils/io/data_buffer.h35
-rw-r--r--source/modules/asura-utils/io/file.cpp8
-rw-r--r--source/modules/asura-utils/io/io_task.cpp4
-rw-r--r--source/modules/asura-utils/scripting/lua_env.h72
-rw-r--r--source/modules/asura-utils/scripting/portable.hpp8
-rw-r--r--source/modules/asura-utils/threading/binding/_thread.cpp10
-rw-r--r--source/modules/asura-utils/threading/conditional.cpp86
-rw-r--r--source/modules/asura-utils/threading/conditional.h41
-rw-r--r--source/modules/asura-utils/threading/mutex.cpp7
-rw-r--r--source/modules/asura-utils/threading/mutex.h10
-rw-r--r--source/modules/asura-utils/threading/semaphore.cpp25
-rw-r--r--source/modules/asura-utils/threading/semaphore.h6
-rw-r--r--source/modules/asura-utils/threading/task.cpp2
-rw-r--r--source/modules/asura-utils/threading/thread.cpp43
-rw-r--r--source/modules/asura-utils/threading/thread.h21
-rw-r--r--source/modules/asura-utils/threading/thread_impl_std.h2
-rw-r--r--source/modules/asura-utils/threading/thread_impl_win32.cpp13
-rw-r--r--source/modules/asura-utils/threading/thread_impl_win32.h2
-rw-r--r--source/modules/asura-utils/threading/threadable.h25
-rw-r--r--source/tests/03-openal/main.cpp7
-rw-r--r--source/tests/05-physfs/main.cpp25
54 files changed, 575 insertions, 358 deletions
diff --git a/bin/win64/05-physfs.exe b/bin/win64/05-physfs.exe
index 78353c7..4686084 100644
--- a/bin/win64/05-physfs.exe
+++ b/bin/win64/05-physfs.exe
Binary files differ
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
new file mode 100644
index 0000000..9a535ec
--- /dev/null
+++ b/build/x64/Debug/03-openal.exe
Binary files differ
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