aboutsummaryrefslogtreecommitdiff
path: root/src/lua/thread
diff options
context:
space:
mode:
Diffstat (limited to 'src/lua/thread')
-rw-r--r--src/lua/thread/Thread.h14
-rw-r--r--src/lua/thread/luaopen_Thread.cpp10
-rw-r--r--src/lua/thread/luaopen_thread.cpp10
3 files changed, 22 insertions, 12 deletions
diff --git a/src/lua/thread/Thread.h b/src/lua/thread/Thread.h
index 63f7524..6969fd8 100644
--- a/src/lua/thread/Thread.h
+++ b/src/lua/thread/Thread.h
@@ -12,17 +12,18 @@ namespace thread
{
public:
typedef jin::thread::Thread::Variant Variant;
+ typedef jin::thread::Thread::ThreadRunner ThreadRunner;
- Thread(std::string _name, std::string _code, jin::thread::Thread::ThreadRunner runner)
+ Thread(std::string _name, std::string _code, ThreadRunner runner)
: name(_name)
, code(_code)
{
thread = new jin::thread::Thread(_name, runner);
}
- bool start()
+ bool start(void* p)
{
- return thread->start();
+ return thread->start(p);
}
void wait()
@@ -75,7 +76,10 @@ namespace thread
thread->unlock();
}
- static void threadRunner(jin::thread::Thread* t);
+ static void threadRunner(Thread* t);
+
+ const std::string name;
+ const std::string code;
private:
~Thread()
@@ -85,8 +89,6 @@ namespace thread
jin::thread::Thread* thread;
- const std::string name;
- const std::string code;
};
} // thread
diff --git a/src/lua/thread/luaopen_Thread.cpp b/src/lua/thread/luaopen_Thread.cpp
index 70a30ee..b6fb33b 100644
--- a/src/lua/thread/luaopen_Thread.cpp
+++ b/src/lua/thread/luaopen_Thread.cpp
@@ -21,7 +21,7 @@ namespace lua
return nullptr;
}
- void Thread::threadRunner(jin::thread::Thread* t)
+ static int threadRunner(void* t)
{
Thread* thread = (Thread*)t;
lua_State* L = lua_open();
@@ -29,10 +29,12 @@ namespace lua
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);
+ return 0;
}
static int l_thread_gc(lua_State* L)
@@ -45,7 +47,7 @@ namespace lua
static int l_start(lua_State* L)
{
Thread* t = checkThread(L);
- bool result = t->start();
+ bool result = t->start(t);
luax_pushboolean(L, result);
return 1;
}
@@ -125,6 +127,7 @@ namespace lua
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;
@@ -158,6 +161,7 @@ namespace lua
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;
@@ -216,7 +220,7 @@ namespace lua
const char* name = luax_checkstring(L, 1);
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* thread = new Thread(name, code, threadRunner);
proxy->bind(thread, JIN_THREAD_THREAD);
return 1;
}
diff --git a/src/lua/thread/luaopen_thread.cpp b/src/lua/thread/luaopen_thread.cpp
index 70a30ee..b6fb33b 100644
--- a/src/lua/thread/luaopen_thread.cpp
+++ b/src/lua/thread/luaopen_thread.cpp
@@ -21,7 +21,7 @@ namespace lua
return nullptr;
}
- void Thread::threadRunner(jin::thread::Thread* t)
+ static int threadRunner(void* t)
{
Thread* thread = (Thread*)t;
lua_State* L = lua_open();
@@ -29,10 +29,12 @@ namespace lua
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);
+ return 0;
}
static int l_thread_gc(lua_State* L)
@@ -45,7 +47,7 @@ namespace lua
static int l_start(lua_State* L)
{
Thread* t = checkThread(L);
- bool result = t->start();
+ bool result = t->start(t);
luax_pushboolean(L, result);
return 1;
}
@@ -125,6 +127,7 @@ namespace lua
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;
@@ -158,6 +161,7 @@ namespace lua
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;
@@ -216,7 +220,7 @@ namespace lua
const char* name = luax_checkstring(L, 1);
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* thread = new Thread(name, code, threadRunner);
proxy->bind(thread, JIN_THREAD_THREAD);
return 1;
}