diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/3rdparty/luax/luax.h | 3 | ||||
-rw-r--r-- | src/libjin/Thread/Thread.cpp | 7 | ||||
-rw-r--r-- | src/libjin/Thread/Thread.h | 48 | ||||
-rw-r--r-- | src/libjin/Utils/Log.h | 10 | ||||
-rw-r--r-- | src/libjin/jin.h | 8 | ||||
-rw-r--r-- | src/libjin/modules.h | 12 | ||||
-rw-r--r-- | src/libjin/thread/thread.cpp | 7 | ||||
-rw-r--r-- | src/libjin/thread/thread.h | 48 | ||||
-rw-r--r-- | src/libjin/utils/log.h | 10 | ||||
-rw-r--r-- | src/lua/luaopen_jin.cpp | 2 | ||||
-rw-r--r-- | src/lua/thread/luaopen_Thread.cpp | 98 | ||||
-rw-r--r-- | src/lua/thread/luaopen_thread.cpp | 98 | ||||
-rw-r--r-- | src/main.cpp | 2 |
13 files changed, 253 insertions, 100 deletions
diff --git a/src/3rdparty/luax/luax.h b/src/3rdparty/luax/luax.h index 8c9fcd8..4940f9f 100644 --- a/src/3rdparty/luax/luax.h +++ b/src/3rdparty/luax/luax.h @@ -32,6 +32,7 @@ #define LUAX_VERSION "0.1.0" #define luax_newstate luaL_newstate +#define luax_close lua_close #define luax_openlibs luaL_openlibs // load chunk but dont run it #define luax_loadbuffer luaL_loadbuffer @@ -40,7 +41,7 @@ #define luax_setglobal lua_setglobal #define luax_pop lua_pop #define luax_newtable lua_newtable - +#define luax_getglobal lua_getglobal /** * */ diff --git a/src/libjin/Thread/Thread.cpp b/src/libjin/Thread/Thread.cpp index 374778b..064d3db 100644 --- a/src/libjin/Thread/Thread.cpp +++ b/src/libjin/Thread/Thread.cpp @@ -296,6 +296,13 @@ namespace thread return v; } + void Thread::remove(int slot) + { + lock(); + common->remove(slot); + unlock(); + } + } // thread } // jin diff --git a/src/libjin/Thread/Thread.h b/src/libjin/Thread/Thread.h index aeb0d9e..37c978d 100644 --- a/src/libjin/Thread/Thread.h +++ b/src/libjin/Thread/Thread.h @@ -42,23 +42,36 @@ namespace thread class Thread { public: - - union Variant + struct Variant { - int integer; - bool boolean; - char character; - const char* cstring; - void* pointer; - float real; - - Variant() {}; - Variant(int i) : integer(i) {}; - Variant(float f) : real(f) {}; - Variant(bool b) : boolean(b) {}; - Variant(char c) : character(c) {}; - Variant(const char* s) : cstring(s) {}; - Variant(void* p) : pointer(p) {}; + enum Type + { + NONE = 0, + INTERGER, + BOOLEAN, + CHARACTER, + CSTRING, + POINTER, + REAL, + }; + Type type; + union + { + int integer; + bool boolean; + char character; + const char* cstring; + void* pointer; + float real; + }; + Variant() :type(NONE) {}; + Variant(const Variant& v){ memcpy(this, &v, sizeof(v)); } + Variant(int i) : integer(i), type(INTERGER) {}; + Variant(float f) : real(f), type(REAL) {}; + Variant(bool b) : boolean(b), type(BOOLEAN) {}; + Variant(char c) : character(c), type(CHARACTER) {}; + Variant(const char* s) : cstring(s), type(CSTRING) {}; + Variant(void* p) : pointer(p), type(POINTER) {}; }; private: @@ -76,6 +89,8 @@ namespace thread static const int SLOT_ERROR = -1; static const int SLOT_WARN = -2; + static const int SLOT_INFO = -3; + static const int SLOT_DEBUG = -4; private: std::map<int, Variant> share; // threads shared value @@ -91,6 +106,7 @@ namespace thread bool receive(int slot); Variant fetch(int slot); Variant demand(int slot); + void remove(int slot); const char* getName(); bool isRunning(); void lock(); diff --git a/src/libjin/Utils/Log.h b/src/libjin/Utils/Log.h index b047402..50ec3c8 100644 --- a/src/libjin/Utils/Log.h +++ b/src/libjin/Utils/Log.h @@ -65,19 +65,19 @@ void Loghelper::log(Level _level, const char* _fmt, ...) switch (_level) { case LV_ERROR: - levelStr = "Error: "; + levelStr = "[Jin Error]:"; break; case LV_WARN: - levelStr = "Warn: "; + levelStr = "[Jin Warn]:"; break; case LV_INFO: - levelStr = "Info: "; + levelStr = "[Jin Info]:"; break; case LV_DEBUG: - levelStr = "Debug: "; + levelStr = "[Jin Debug]:"; break; default: - levelStr = "Unknown: "; + levelStr = "[Jin Unknown]:"; break; } char buffer[FORMAT_MSG_BUFFER_SIZE + 1] = { 0 }; diff --git a/src/libjin/jin.h b/src/libjin/jin.h index ad83fae..239fddd 100644 --- a/src/libjin/jin.h +++ b/src/libjin/jin.h @@ -15,9 +15,9 @@ #include "Time/Timer.h" #include "Thread/Thread.h" -const char* JIN_VERSION = "Jin 0.1"; -const char* JIN_AUTHOR = "Chai"; -const char* JIN_RELEASE = "Jin 0.1.1"; -const int JIN_VERSION_NUM = 101; +#define JIN_VERSION "Jin 0.1"; +#define JIN_AUTHOR "Chai"; +#define JIN_RELEASE "Jin 0.1.1"; +#define JIN_VERSION_NUM 101; #endif // __JIN_H
\ No newline at end of file diff --git a/src/libjin/modules.h b/src/libjin/modules.h index 06c14df..13e288f 100644 --- a/src/libjin/modules.h +++ b/src/libjin/modules.h @@ -6,7 +6,7 @@ #define JIN_MODULES_AUDIO 1 #define JIN_AUDIO_SDLAUDIO 1 -#define JIN_AUDIO_OPENAL 1 +#define JIN_AUDIO_OPENAL 0 #define JIN_MODULES_RENDER 1 @@ -21,15 +21,15 @@ #define JIN_MODULES_NET 1 -#define JIN_MODULES_PHYSICS 1 +#define JIN_MODULES_PHYSICS 0 #define JIN_PHYSICS_BOX2D 1 #define JIN_PHYSICS_NEWTON 1 -#define JIN_MODULES_TILEMAP 1 +#define JIN_MODULES_TILEMAP 0 -#define JIN_MODULES_UI 1 +#define JIN_MODULES_UI 0 -#define JIN_MODULES_TOOLS 1 +#define JIN_MODULES_TOOLS 0 #define JIN_TOOLS_COMPONENT 1 #define JIN_TOOLS_EVENTMSGCENTER 1 #define JIN_TOOLS_XML 1 @@ -48,7 +48,7 @@ * Open libjin debug */ -#define JIN_DEBUG 1 +#define JIN_DEBUG 0 /* * Operating system diff --git a/src/libjin/thread/thread.cpp b/src/libjin/thread/thread.cpp index 374778b..064d3db 100644 --- a/src/libjin/thread/thread.cpp +++ b/src/libjin/thread/thread.cpp @@ -296,6 +296,13 @@ namespace thread return v; } + void Thread::remove(int slot) + { + lock(); + common->remove(slot); + unlock(); + } + } // thread } // jin diff --git a/src/libjin/thread/thread.h b/src/libjin/thread/thread.h index aeb0d9e..37c978d 100644 --- a/src/libjin/thread/thread.h +++ b/src/libjin/thread/thread.h @@ -42,23 +42,36 @@ namespace thread class Thread { public: - - union Variant + struct Variant { - int integer; - bool boolean; - char character; - const char* cstring; - void* pointer; - float real; - - Variant() {}; - Variant(int i) : integer(i) {}; - Variant(float f) : real(f) {}; - Variant(bool b) : boolean(b) {}; - Variant(char c) : character(c) {}; - Variant(const char* s) : cstring(s) {}; - Variant(void* p) : pointer(p) {}; + enum Type + { + NONE = 0, + INTERGER, + BOOLEAN, + CHARACTER, + CSTRING, + POINTER, + REAL, + }; + Type type; + union + { + int integer; + bool boolean; + char character; + const char* cstring; + void* pointer; + float real; + }; + Variant() :type(NONE) {}; + Variant(const Variant& v){ memcpy(this, &v, sizeof(v)); } + Variant(int i) : integer(i), type(INTERGER) {}; + Variant(float f) : real(f), type(REAL) {}; + Variant(bool b) : boolean(b), type(BOOLEAN) {}; + Variant(char c) : character(c), type(CHARACTER) {}; + Variant(const char* s) : cstring(s), type(CSTRING) {}; + Variant(void* p) : pointer(p), type(POINTER) {}; }; private: @@ -76,6 +89,8 @@ namespace thread static const int SLOT_ERROR = -1; static const int SLOT_WARN = -2; + static const int SLOT_INFO = -3; + static const int SLOT_DEBUG = -4; private: std::map<int, Variant> share; // threads shared value @@ -91,6 +106,7 @@ namespace thread bool receive(int slot); Variant fetch(int slot); Variant demand(int slot); + void remove(int slot); const char* getName(); bool isRunning(); void lock(); diff --git a/src/libjin/utils/log.h b/src/libjin/utils/log.h index b047402..50ec3c8 100644 --- a/src/libjin/utils/log.h +++ b/src/libjin/utils/log.h @@ -65,19 +65,19 @@ void Loghelper::log(Level _level, const char* _fmt, ...) switch (_level) { case LV_ERROR: - levelStr = "Error: "; + levelStr = "[Jin Error]:"; break; case LV_WARN: - levelStr = "Warn: "; + levelStr = "[Jin Warn]:"; break; case LV_INFO: - levelStr = "Info: "; + levelStr = "[Jin Info]:"; break; case LV_DEBUG: - levelStr = "Debug: "; + levelStr = "[Jin Debug]:"; break; default: - levelStr = "Unknown: "; + levelStr = "[Jin Unknown]:"; break; } char buffer[FORMAT_MSG_BUFFER_SIZE + 1] = { 0 }; diff --git a/src/lua/luaopen_jin.cpp b/src/lua/luaopen_jin.cpp index 7f84467..4113ffe 100644 --- a/src/lua/luaopen_jin.cpp +++ b/src/lua/luaopen_jin.cpp @@ -18,6 +18,7 @@ namespace lua extern int luaopen_filesystem(lua_State* L); extern int luaopen_joypad(lua_State* L); extern int luaopen_math(lua_State* L); + extern int luaopen_thread(lua_State* L); static int l_getversion(lua_State* L) { @@ -70,6 +71,7 @@ namespace lua {"audio", luaopen_audio}, {"joypad", luaopen_joypad}, {"math", luaopen_math}, + {"thread", luaopen_thread}, {0, 0} }; diff --git a/src/lua/thread/luaopen_Thread.cpp b/src/lua/thread/luaopen_Thread.cpp index 99ddee1..4c38899 100644 --- a/src/lua/thread/luaopen_Thread.cpp +++ b/src/lua/thread/luaopen_Thread.cpp @@ -8,7 +8,7 @@ namespace jin namespace lua { - static int luaopen_thread(lua_State* L); + int luaopen_thread(lua_State* L); class Thread : public jin::thread::Thread { @@ -19,7 +19,9 @@ namespace jin , code(_code) { } + static void threadRunner(jin::thread::Thread* t); + private: const std::string name; const std::string code; }; @@ -32,18 +34,25 @@ namespace jin return nullptr; } - static void threadRunner(jin::thread::Thread* t) + void Thread::threadRunner(jin::thread::Thread* t) { Thread* thread = (Thread*)t; lua_State* L = lua_open(); luax_openlibs(L); luaopen_jin(L); + luax_getglobal(L, MODULE_NAME); + Proxy* proxy = (Proxy*)luax_newinstance(L, TYPE_THREAD, sizeof(Proxy)); + proxy->bind(thread); + luax_setfield(L, -2, "_curThread"); luax_dostring(L, thread->code.c_str()); + luax_close(L); } static int l_gc(lua_State* L) { - return 1; + Thread* t = checkThread(L); + delete t; + return 0; } static int l_start(lua_State* L) @@ -97,38 +106,74 @@ namespace jin Thread* t = checkThread(L); int slot = luax_checkinteger(L, 2); Thread::Variant v = t->fetch(slot); - //if (v.type == Thread::Value::INTEGER) - //{ - // luax_pushinteger(L, v.integer); - //} - //else if (v.type == Thread::Value::BOOL) - //{ - // luax_pushboolean(L, v.boolean); - //} - //else if (v.type == Thread::Value::STRING) - //{ - // luax_pushstring(L, v.cstring); - //} - //else if (v.type == Thread::Value::POINTER) - //{ - //} + switch (v.type) + { + case thread::Thread::Variant::INTERGER: + luax_pushinteger(L, v.integer); + break; + + case thread::Thread::Variant::BOOLEAN: + luax_pushboolean(L, v.boolean); + break; + + case thread::Thread::Variant::CSTRING: + luax_pushstring(L, v.cstring); + break; + + case thread::Thread::Variant::REAL: + luax_pushnumber(L, v.real); + break; + } return 1; } static int l_demand(lua_State* L) { Thread* t = checkThread(L); - + int slot = luax_checkinteger(L, 2); + Thread::Variant v = t->demand(slot); + switch (v.type) + { + case thread::Thread::Variant::INTERGER: + luax_pushinteger(L, v.integer); + break; + + case thread::Thread::Variant::BOOLEAN: + luax_pushboolean(L, v.boolean); + break; + + case thread::Thread::Variant::CSTRING: + luax_pushstring(L, v.cstring); + break; + + case thread::Thread::Variant::REAL: + luax_pushnumber(L, v.real); + break; + } return 1; } + static int l_remove(lua_State* L) + { + Thread* t = checkThread(L); + int slot = luax_checkinteger(L, 1); + t->remove(slot); + return 0; + } + static int l_getName(lua_State* L) { + Thread* t = checkThread(L); + const char* name = t->getName(); + luax_pushstring(L, name); return 1; } static int l_isRunning(lua_State* L) { + Thread* t = checkThread(L); + bool running = t->isRunning(); + luax_pushboolean(L, running); return 1; } @@ -140,6 +185,7 @@ namespace jin { "receive", l_receive }, { "fetch", l_fetch }, { "demand", l_demand }, + { "remove", l_remove }, { "getName", l_getName }, { "isRunning", l_isRunning }, { 0, 0 } @@ -147,7 +193,7 @@ namespace jin static int luaopen_Thread(lua_State* L) { - luax_newtype(L, TYPE_SOURCE, thread_function); + luax_newtype(L, TYPE_THREAD, thread_function); return 0; } @@ -158,14 +204,16 @@ namespace jin const char* name = luax_checkstring(L, 1); const char* code = luax_checkstring(L, 2); Proxy* proxy = (Proxy*)luax_newinstance(L, TYPE_THREAD, sizeof(Proxy)); - Thread* thread = new Thread(name, code, threadRunner); + Thread* thread = new Thread(name, code, Thread::threadRunner); proxy->bind(thread); return 1; } static int l_getThread(lua_State* L) { - + luax_getglobal(L, MODULE_NAME); + luax_getfield(L, -1, "_curThread"); + return 1; } static const luaL_Reg f[] = { @@ -174,9 +222,13 @@ namespace jin { 0, 0 } }; - static int luaopen_thread(lua_State* L) + int luaopen_thread(lua_State* L) { + luaopen_Thread(L); + + luax_newlib(L, f); + return 1; } } }
\ No newline at end of file diff --git a/src/lua/thread/luaopen_thread.cpp b/src/lua/thread/luaopen_thread.cpp index 99ddee1..4c38899 100644 --- a/src/lua/thread/luaopen_thread.cpp +++ b/src/lua/thread/luaopen_thread.cpp @@ -8,7 +8,7 @@ namespace jin namespace lua { - static int luaopen_thread(lua_State* L); + int luaopen_thread(lua_State* L); class Thread : public jin::thread::Thread { @@ -19,7 +19,9 @@ namespace jin , code(_code) { } + static void threadRunner(jin::thread::Thread* t); + private: const std::string name; const std::string code; }; @@ -32,18 +34,25 @@ namespace jin return nullptr; } - static void threadRunner(jin::thread::Thread* t) + void Thread::threadRunner(jin::thread::Thread* t) { Thread* thread = (Thread*)t; lua_State* L = lua_open(); luax_openlibs(L); luaopen_jin(L); + luax_getglobal(L, MODULE_NAME); + Proxy* proxy = (Proxy*)luax_newinstance(L, TYPE_THREAD, sizeof(Proxy)); + proxy->bind(thread); + luax_setfield(L, -2, "_curThread"); luax_dostring(L, thread->code.c_str()); + luax_close(L); } static int l_gc(lua_State* L) { - return 1; + Thread* t = checkThread(L); + delete t; + return 0; } static int l_start(lua_State* L) @@ -97,38 +106,74 @@ namespace jin Thread* t = checkThread(L); int slot = luax_checkinteger(L, 2); Thread::Variant v = t->fetch(slot); - //if (v.type == Thread::Value::INTEGER) - //{ - // luax_pushinteger(L, v.integer); - //} - //else if (v.type == Thread::Value::BOOL) - //{ - // luax_pushboolean(L, v.boolean); - //} - //else if (v.type == Thread::Value::STRING) - //{ - // luax_pushstring(L, v.cstring); - //} - //else if (v.type == Thread::Value::POINTER) - //{ - //} + switch (v.type) + { + case thread::Thread::Variant::INTERGER: + luax_pushinteger(L, v.integer); + break; + + case thread::Thread::Variant::BOOLEAN: + luax_pushboolean(L, v.boolean); + break; + + case thread::Thread::Variant::CSTRING: + luax_pushstring(L, v.cstring); + break; + + case thread::Thread::Variant::REAL: + luax_pushnumber(L, v.real); + break; + } return 1; } static int l_demand(lua_State* L) { Thread* t = checkThread(L); - + int slot = luax_checkinteger(L, 2); + Thread::Variant v = t->demand(slot); + switch (v.type) + { + case thread::Thread::Variant::INTERGER: + luax_pushinteger(L, v.integer); + break; + + case thread::Thread::Variant::BOOLEAN: + luax_pushboolean(L, v.boolean); + break; + + case thread::Thread::Variant::CSTRING: + luax_pushstring(L, v.cstring); + break; + + case thread::Thread::Variant::REAL: + luax_pushnumber(L, v.real); + break; + } return 1; } + static int l_remove(lua_State* L) + { + Thread* t = checkThread(L); + int slot = luax_checkinteger(L, 1); + t->remove(slot); + return 0; + } + static int l_getName(lua_State* L) { + Thread* t = checkThread(L); + const char* name = t->getName(); + luax_pushstring(L, name); return 1; } static int l_isRunning(lua_State* L) { + Thread* t = checkThread(L); + bool running = t->isRunning(); + luax_pushboolean(L, running); return 1; } @@ -140,6 +185,7 @@ namespace jin { "receive", l_receive }, { "fetch", l_fetch }, { "demand", l_demand }, + { "remove", l_remove }, { "getName", l_getName }, { "isRunning", l_isRunning }, { 0, 0 } @@ -147,7 +193,7 @@ namespace jin static int luaopen_Thread(lua_State* L) { - luax_newtype(L, TYPE_SOURCE, thread_function); + luax_newtype(L, TYPE_THREAD, thread_function); return 0; } @@ -158,14 +204,16 @@ namespace jin const char* name = luax_checkstring(L, 1); const char* code = luax_checkstring(L, 2); Proxy* proxy = (Proxy*)luax_newinstance(L, TYPE_THREAD, sizeof(Proxy)); - Thread* thread = new Thread(name, code, threadRunner); + Thread* thread = new Thread(name, code, Thread::threadRunner); proxy->bind(thread); return 1; } static int l_getThread(lua_State* L) { - + luax_getglobal(L, MODULE_NAME); + luax_getfield(L, -1, "_curThread"); + return 1; } static const luaL_Reg f[] = { @@ -174,9 +222,13 @@ namespace jin { 0, 0 } }; - static int luaopen_thread(lua_State* L) + int luaopen_thread(lua_State* L) { + luaopen_Thread(L); + + luax_newlib(L, f); + return 1; } } }
\ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 256f39d..51b100f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -42,9 +42,9 @@ int main(int argc, char* argv[]) #endif #undef BUFFER_SIZE luax_setfield_string(L, "_dir", buffer); - // boot jin::lua::boot(L); + luax_close(L); return 0; }
\ No newline at end of file |