aboutsummaryrefslogtreecommitdiff
path: root/src/lua/thread/luaopen_Thread.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2018-08-14 09:26:22 +0800
committerchai <chaifix@163.com>2018-08-14 09:26:22 +0800
commit5162f84be0a4deb447c6ba1226722b049335d525 (patch)
tree5f7ed0ddc05b1499eaf0607b88fd5cb5e2a961c1 /src/lua/thread/luaopen_Thread.cpp
parent636e766791dc8680d237fafe4ff6dd904e16a860 (diff)
*update
Diffstat (limited to 'src/lua/thread/luaopen_Thread.cpp')
-rw-r--r--src/lua/thread/luaopen_Thread.cpp16
1 files changed, 12 insertions, 4 deletions
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;
}