aboutsummaryrefslogtreecommitdiff
path: root/src/lua/thread/luaopen_Thread.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2018-08-07 11:51:37 +0800
committerchai <chaifix@163.com>2018-08-07 11:51:37 +0800
commita46931ada5343e8f5b863719c733f5bfc91c663f (patch)
tree243e77ea0ca1aa5a4b7a235be62efde22914b96e /src/lua/thread/luaopen_Thread.cpp
parente4eeedbd6faaef380b58236745856b50cebf4461 (diff)
*update
Diffstat (limited to 'src/lua/thread/luaopen_Thread.cpp')
-rw-r--r--src/lua/thread/luaopen_Thread.cpp98
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