diff options
Diffstat (limited to 'src/libjin-lua/modules/thread')
-rw-r--r-- | src/libjin-lua/modules/thread/je_lua_thread.cpp | 240 | ||||
-rw-r--r-- | src/libjin-lua/modules/thread/je_lua_thread.h | 95 |
2 files changed, 335 insertions, 0 deletions
diff --git a/src/libjin-lua/modules/thread/je_lua_thread.cpp b/src/libjin-lua/modules/thread/je_lua_thread.cpp new file mode 100644 index 0000000..2af3e53 --- /dev/null +++ b/src/libjin-lua/modules/thread/je_lua_thread.cpp @@ -0,0 +1,240 @@ +#include "common/je_lua_object.h" + +#include "libjin/jin.h" +#include "libjin-lua/je_lua_jin.h" +#include "common/je_lua_common.h" +#include "je_lua_thread.h" + +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 JinEngine
\ No newline at end of file diff --git a/src/libjin-lua/modules/thread/je_lua_thread.h b/src/libjin-lua/modules/thread/je_lua_thread.h new file mode 100644 index 0000000..acb4c49 --- /dev/null +++ b/src/libjin-lua/modules/thread/je_lua_thread.h @@ -0,0 +1,95 @@ +#include "libjin/jin.h" +#include "common/je_lua_common.h" + +namespace JinEngine +{ + namespace Lua + { + + extern const char* Jin_Lua_Thread; + + class Thread : public Object + { + public: + typedef JinEngine::Threads::Thread::Variant Variant; + typedef JinEngine::Threads::Thread::ThreadRunner ThreadRunner; + + Thread(std::string _name, std::string _code, ThreadRunner runner) + : name(_name) + , code(_code) + { + thread = new JinEngine::Threads::Thread(_name, runner); + } + + ~Thread() + { + delete thread; + } + + bool start(void* p) + { + return thread->start(p); + } + + void wait() + { + thread->wait(); + } + + void send(int slot, const Variant& value) + { + thread->send(slot, value); + } + + bool receive(int slot) + { + return thread->receive(slot); + } + + Variant fetch(int slot) + { + return thread->fetch(slot); + } + + Variant demand(int slot) + { + return thread->demand(slot); + } + + void remove(int slot) + { + thread->remove(slot); + } + + const char* getName() + { + return name.c_str(); + } + + bool isRunning() + { + return thread->isRunning(); + } + + void lock() + { + thread->lock(); + } + + void unlock() + { + thread->unlock(); + } + + const std::string name; + const std::string code; + + private: + JinEngine::Threads::Thread* thread; + + }; + + int luaopen_thread(lua_State* L); + + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file |