diff options
author | chai <chaifix@163.com> | 2018-08-07 11:51:37 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2018-08-07 11:51:37 +0800 |
commit | a46931ada5343e8f5b863719c733f5bfc91c663f (patch) | |
tree | 243e77ea0ca1aa5a4b7a235be62efde22914b96e /src/lua/thread/luaopen_Thread.cpp | |
parent | e4eeedbd6faaef380b58236745856b50cebf4461 (diff) |
*update
Diffstat (limited to 'src/lua/thread/luaopen_Thread.cpp')
-rw-r--r-- | src/lua/thread/luaopen_Thread.cpp | 98 |
1 files changed, 75 insertions, 23 deletions
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 |