From 5162f84be0a4deb447c6ba1226722b049335d525 Mon Sep 17 00:00:00 2001 From: chai Date: Tue, 14 Aug 2018 09:26:22 +0800 Subject: *update --- src/lua/thread/luaopen_thread.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'src/lua/thread/luaopen_thread.cpp') diff --git a/src/lua/thread/luaopen_thread.cpp b/src/lua/thread/luaopen_thread.cpp index 393a29d..4eabc07 100644 --- a/src/lua/thread/luaopen_thread.cpp +++ b/src/lua/thread/luaopen_thread.cpp @@ -11,6 +11,7 @@ namespace jin int luaopen_thread(lua_State* L); class Thread : public jin::thread::Thread + , public Object { public: Thread(std::string _name, std::string _code, jin::thread::Thread::ThreadRunner runner) @@ -22,6 +23,9 @@ namespace jin static void threadRunner(jin::thread::Thread* t); private: + ~Thread() + {} + const std::string name; const std::string code; }; @@ -42,16 +46,17 @@ namespace jin luaopen_jin(L); luax_getglobal(L, MODULE_NAME); Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_THREAD_THREAD, sizeof(Proxy)); + thread->retain(); proxy->bind(thread, JIN_THREAD_THREAD); luax_setfield(L, -2, "_curThread"); luax_dostring(L, thread->code.c_str()); luax_close(L); } - static int l_gc(lua_State* L) + static int l_thread_gc(lua_State* L) { - Thread* t = checkThread(L); - delete t; + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_THREAD_THREAD); + proxy->release(); return 0; } @@ -138,6 +143,7 @@ namespace jin case thread::Thread::Variant::POINTER: Proxy* p = (Proxy*)v.pointer; Proxy* proxy = (Proxy*)luax_newinstance(L, p->type, sizeof(Proxy)); + p->object->retain(); proxy->bind(p->object, p->type); break; @@ -171,6 +177,7 @@ namespace jin case thread::Thread::Variant::POINTER: Proxy* p = (Proxy*)v.pointer; Proxy* proxy = (Proxy*)luax_newinstance(L, p->type, sizeof(Proxy)); + p->object->retain(); proxy->bind(p->object, p->type); break; @@ -203,7 +210,7 @@ namespace jin } static const luaL_Reg thread_function[] = { - { "__gc", l_gc }, + { "__gc", l_thread_gc }, { "start", l_start }, { "wait", l_wait }, { "send", l_send }, @@ -230,6 +237,7 @@ namespace jin const char* code = luax_checkstring(L, 2); Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_THREAD_THREAD, sizeof(Proxy)); Thread* thread = new Thread(name, code, Thread::threadRunner); + thread->retain(); proxy->bind(thread, JIN_THREAD_THREAD); return 1; } -- cgit v1.1-26-g67d0