aboutsummaryrefslogtreecommitdiff
path: root/src/libjin-lua/modules/thread/l_thread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libjin-lua/modules/thread/l_thread.cpp')
-rw-r--r--src/libjin-lua/modules/thread/l_thread.cpp460
1 files changed, 230 insertions, 230 deletions
diff --git a/src/libjin-lua/modules/thread/l_thread.cpp b/src/libjin-lua/modules/thread/l_thread.cpp
index 757244a..4fef77a 100644
--- a/src/libjin-lua/modules/thread/l_thread.cpp
+++ b/src/libjin-lua/modules/thread/l_thread.cpp
@@ -7,234 +7,234 @@
namespace JinEngine
{
- namespace Lua
- {
-
- const char* Jin_Lua_Thread = "Thread";
-
- int luaopen_thread(lua_State* L);
-
- static inline Thread* checkThread(lua_State* L)
- {
- LuaObject* luaObj = (LuaObject*)luax_checktype(L, 1, Jin_Lua_Thread);
- return luaObj->getObject<Thread>();
- }
-
- LUA_IMPLEMENT int threadRunner(void* t)
- {
- Shared* shared = (Shared*)t;
- Thread* thread = shared->getObject<Thread>();
- lua_State* L = lua_open();
- luax_openlibs(L);
- open(L);
- luax_getglobal(L, MODULE_NAME);
- LuaObject* luaObj = luax_newinstance(L, Jin_Lua_Thread, shared);
- luax_setfield(L, -2, "_curThread");
- luax_dostring(L, thread->code.c_str());
- luax_close(L);
- return 0;
- }
-
- LUA_IMPLEMENT int l_thread_gc(lua_State* L)
- {
- LuaObject* luaObj = (LuaObject*)luax_checktype(L, 1, Jin_Lua_Thread);
- luaObj->release();
- return 0;
- }
-
- LUA_IMPLEMENT int l_start(lua_State* L)
- {
- Thread* shared = checkThread(L);
- bool result = shared->start(&shared);
- luax_pushboolean(L, result);
- return 1;
- }
-
- LUA_IMPLEMENT int l_wait(lua_State* L)
- {
- Thread* shared = checkThread(L);
- shared->wait();
- return 0;
- }
-
- LUA_IMPLEMENT int l_send(lua_State* L)
- {
- Thread* shared = checkThread(L);
- int slot = luax_checkinteger(L, 2);
- const int vp = 3;
- if (luax_isnumberstrict(L, vp))
- {
- float real = luax_checknumber(L, vp);
- shared->send(slot, real);
- }
- else if (luax_isbooleanstrict(L, vp))
- {
- bool bol = luax_checkbool(L, vp);
- shared->send(slot, bol);
- }
- else if (luax_isstringstrict(L, vp))
- {
- const char* str = luax_checkstring(L, vp);
- shared->send(slot, str);
- }
- else if (luax_isuserdata(L, vp))
- {
- LuaObject* luaObj = (LuaObject*)luax_touserdata(L, vp);
- shared->send(slot, luaObj);
- }/*
- else if (luax_islightuserdata(L, vp))
- {
- void* p = luax_tolightuserdata(L, vp);
- shared->send(slot, p);
- }*/
- return 0;
- }
-
- LUA_IMPLEMENT int l_receive(lua_State* L)
- {
- Thread* shared = checkThread(L);
- int slot = luax_checkinteger(L, 2);
- bool result = shared->receive(slot);
- luax_pushboolean(L, result);
- return 1;
- }
-
- LUA_IMPLEMENT int l_fetch(lua_State* L)
- {
- Thread* shared = checkThread(L);
- int slot = luax_checkinteger(L, 2);
- Thread::Variant v = shared->fetch(slot);
- switch (v.type)
- {
- case Thread::Variant::INTERGER:
- luax_pushinteger(L, v.integer);
- break;
-
- case Thread::Variant::BOOLEAN:
- luax_pushboolean(L, v.boolean);
- break;
-
- case Thread::Variant::CSTRING:
- luax_pushstring(L, v.cstring);
- break;
-
- case Thread::Variant::REAL:
- luax_pushnumber(L, v.real);
- break;
-
- case Thread::Variant::POINTER:
- LuaObject* p = (LuaObject*)v.pointer;
- // Create lua object from other lua_State.
- LuaObject* luaObj = luax_copyinstance(L, p);
- break;
-
- }
- return 1;
- }
-
- LUA_IMPLEMENT int l_demand(lua_State* L)
- {
- Thread* shared = checkThread(L);
- int slot = luax_checkinteger(L, 2);
- Thread::Variant v = shared->demand(slot);
- switch (v.type)
- {
- case Thread::Variant::INTERGER:
- luax_pushinteger(L, v.integer);
- break;
-
- case Thread::Variant::BOOLEAN:
- luax_pushboolean(L, v.boolean);
- break;
-
- case Thread::Variant::CSTRING:
- luax_pushstring(L, v.cstring);
- break;
-
- case Thread::Variant::REAL:
- luax_pushnumber(L, v.real);
- break;
-
- case Thread::Variant::POINTER:
- LuaObject* p = (LuaObject*)v.pointer;
- // Create lua object from other lua_State.
- LuaObject* luaObj = luax_copyinstance(L, p);
- break;
-
- }
- return 1;
- }
-
- LUA_IMPLEMENT int l_remove(lua_State* L)
- {
- Thread* shared = checkThread(L);
- int slot = luax_checkinteger(L, 2);
- shared->remove(slot);
- return 0;
- }
-
- LUA_IMPLEMENT int l_getName(lua_State* L)
- {
- Thread* shared = checkThread(L);
- const char* name = shared->getName();
- luax_pushstring(L, name);
- return 1;
- }
-
- LUA_IMPLEMENT int l_isRunning(lua_State* L)
- {
- Thread* shared = checkThread(L);
- bool running = shared->isRunning();
- luax_pushboolean(L, running);
- return 1;
- }
-
- LUA_IMPLEMENT int luaopen_Thread(lua_State* L)
- {
- luaL_Reg thread_function[] = {
- { "__gc", l_thread_gc },
- { "start", l_start },
- { "wait", l_wait },
- { "send", l_send },
- { "receive", l_receive },
- { "fetch", l_fetch },
- { "demand", l_demand },
- { "remove", l_remove },
- { "getName", l_getName },
- { "isRunning", l_isRunning },
- { 0, 0 }
- };
- luax_newtype(L, Jin_Lua_Thread, thread_function);
- return 0;
- }
-
- LUA_IMPLEMENT int l_newThread(lua_State* L)
- {
- const char* name = luax_checkstring(L, 1);
- const char* code = luax_checkstring(L, 2);
- Thread* thread = new Thread(name, code, threadRunner);
- LuaObject* luaObj = luax_newinstance(L, Jin_Lua_Thread, new Shared(thread));
- return 1;
- }
-
- LUA_IMPLEMENT int l_getThread(lua_State* L)
- {
- luax_getglobal(L, MODULE_NAME);
- luax_getfield(L, -1, "_curThread");
- return 1;
- }
-
- LUA_EXPORT int luaopen_thread(lua_State* L)
- {
- luaopen_Thread(L);
- luaL_Reg methods[] = {
- { "newThread", l_newThread },
- { "getThread", l_getThread },
- { 0, 0 }
- };
- luax_newlib(L, methods);
- return 1;
- }
-
- } // namespace Lua
+ namespace Lua
+ {
+
+ const char* Jin_Lua_Thread = "Thread";
+
+ int luaopen_thread(lua_State* L);
+
+ static inline Thread* checkThread(lua_State* L)
+ {
+ LuaObject* luaObj = (LuaObject*)luax_checktype(L, 1, Jin_Lua_Thread);
+ return luaObj->getObject<Thread>();
+ }
+
+ LUA_IMPLEMENT int threadRunner(void* t)
+ {
+ Shared* shared = (Shared*)t;
+ Thread* thread = shared->getObject<Thread>();
+ lua_State* L = lua_open();
+ luax_openlibs(L);
+ open(L);
+ luax_getglobal(L, MODULE_NAME);
+ LuaObject* luaObj = luax_newinstance(L, Jin_Lua_Thread, shared);
+ luax_setfield(L, -2, "_curThread");
+ luax_dostring(L, thread->code.c_str());
+ luax_close(L);
+ return 0;
+ }
+
+ LUA_IMPLEMENT int l_thread_gc(lua_State* L)
+ {
+ LuaObject* luaObj = (LuaObject*)luax_checktype(L, 1, Jin_Lua_Thread);
+ luaObj->release();
+ return 0;
+ }
+
+ LUA_IMPLEMENT int l_start(lua_State* L)
+ {
+ Thread* shared = checkThread(L);
+ bool result = shared->start(&shared);
+ luax_pushboolean(L, result);
+ return 1;
+ }
+
+ LUA_IMPLEMENT int l_wait(lua_State* L)
+ {
+ Thread* shared = checkThread(L);
+ shared->wait();
+ return 0;
+ }
+
+ LUA_IMPLEMENT int l_send(lua_State* L)
+ {
+ Thread* shared = checkThread(L);
+ int slot = luax_checkinteger(L, 2);
+ const int vp = 3;
+ if (luax_isnumberstrict(L, vp))
+ {
+ float real = luax_checknumber(L, vp);
+ shared->send(slot, real);
+ }
+ else if (luax_isbooleanstrict(L, vp))
+ {
+ bool bol = luax_checkbool(L, vp);
+ shared->send(slot, bol);
+ }
+ else if (luax_isstringstrict(L, vp))
+ {
+ const char* str = luax_checkstring(L, vp);
+ shared->send(slot, str);
+ }
+ else if (luax_isuserdata(L, vp))
+ {
+ LuaObject* luaObj = (LuaObject*)luax_touserdata(L, vp);
+ shared->send(slot, luaObj);
+ }/*
+ else if (luax_islightuserdata(L, vp))
+ {
+ void* p = luax_tolightuserdata(L, vp);
+ shared->send(slot, p);
+ }*/
+ return 0;
+ }
+
+ LUA_IMPLEMENT int l_receive(lua_State* L)
+ {
+ Thread* shared = checkThread(L);
+ int slot = luax_checkinteger(L, 2);
+ bool result = shared->receive(slot);
+ luax_pushboolean(L, result);
+ return 1;
+ }
+
+ LUA_IMPLEMENT int l_fetch(lua_State* L)
+ {
+ Thread* shared = checkThread(L);
+ int slot = luax_checkinteger(L, 2);
+ Thread::Variant v = shared->fetch(slot);
+ switch (v.type)
+ {
+ case Thread::Variant::INTERGER:
+ luax_pushinteger(L, v.integer);
+ break;
+
+ case Thread::Variant::BOOLEAN:
+ luax_pushboolean(L, v.boolean);
+ break;
+
+ case Thread::Variant::CSTRING:
+ luax_pushstring(L, v.cstring);
+ break;
+
+ case Thread::Variant::REAL:
+ luax_pushnumber(L, v.real);
+ break;
+
+ case Thread::Variant::POINTER:
+ LuaObject* p = (LuaObject*)v.pointer;
+ // Create lua object from other lua_State.
+ LuaObject* luaObj = luax_copyinstance(L, p);
+ break;
+
+ }
+ return 1;
+ }
+
+ LUA_IMPLEMENT int l_demand(lua_State* L)
+ {
+ Thread* shared = checkThread(L);
+ int slot = luax_checkinteger(L, 2);
+ Thread::Variant v = shared->demand(slot);
+ switch (v.type)
+ {
+ case Thread::Variant::INTERGER:
+ luax_pushinteger(L, v.integer);
+ break;
+
+ case Thread::Variant::BOOLEAN:
+ luax_pushboolean(L, v.boolean);
+ break;
+
+ case Thread::Variant::CSTRING:
+ luax_pushstring(L, v.cstring);
+ break;
+
+ case Thread::Variant::REAL:
+ luax_pushnumber(L, v.real);
+ break;
+
+ case Thread::Variant::POINTER:
+ LuaObject* p = (LuaObject*)v.pointer;
+ // Create lua object from other lua_State.
+ LuaObject* luaObj = luax_copyinstance(L, p);
+ break;
+
+ }
+ return 1;
+ }
+
+ LUA_IMPLEMENT int l_remove(lua_State* L)
+ {
+ Thread* shared = checkThread(L);
+ int slot = luax_checkinteger(L, 2);
+ shared->remove(slot);
+ return 0;
+ }
+
+ LUA_IMPLEMENT int l_getName(lua_State* L)
+ {
+ Thread* shared = checkThread(L);
+ const char* name = shared->getName();
+ luax_pushstring(L, name);
+ return 1;
+ }
+
+ LUA_IMPLEMENT int l_isRunning(lua_State* L)
+ {
+ Thread* shared = checkThread(L);
+ bool running = shared->isRunning();
+ luax_pushboolean(L, running);
+ return 1;
+ }
+
+ LUA_IMPLEMENT int luaopen_Thread(lua_State* L)
+ {
+ luaL_Reg thread_function[] = {
+ { "__gc", l_thread_gc },
+ { "start", l_start },
+ { "wait", l_wait },
+ { "send", l_send },
+ { "receive", l_receive },
+ { "fetch", l_fetch },
+ { "demand", l_demand },
+ { "remove", l_remove },
+ { "getName", l_getName },
+ { "isRunning", l_isRunning },
+ { 0, 0 }
+ };
+ luax_newtype(L, Jin_Lua_Thread, thread_function);
+ return 0;
+ }
+
+ LUA_IMPLEMENT int l_newThread(lua_State* L)
+ {
+ const char* name = luax_checkstring(L, 1);
+ const char* code = luax_checkstring(L, 2);
+ Thread* thread = new Thread(name, code, threadRunner);
+ LuaObject* luaObj = luax_newinstance(L, Jin_Lua_Thread, new Shared(thread));
+ return 1;
+ }
+
+ LUA_IMPLEMENT int l_getThread(lua_State* L)
+ {
+ luax_getglobal(L, MODULE_NAME);
+ luax_getfield(L, -1, "_curThread");
+ return 1;
+ }
+
+ LUA_EXPORT int luaopen_thread(lua_State* L)
+ {
+ luaopen_Thread(L);
+ luaL_Reg methods[] = {
+ { "newThread", l_newThread },
+ { "getThread", l_getThread },
+ { 0, 0 }
+ };
+ luax_newlib(L, methods);
+ return 1;
+ }
+
+ } // namespace Lua
} // namespace JinEngine \ No newline at end of file