int w_Thread_set(lua_State *L) { Thread *t = luax_checkthread(L, 1); std::string name = luax_checklstring(L, 2); ThreadVariant *v; size_t len; const char *str; switch(lua_type(L, 3)) { case LUA_TBOOLEAN: v = new ThreadVariant(luax_toboolean(L, 3)); break; case LUA_TNUMBER: v = new ThreadVariant(lua_tonumber(L, 3)); break; case LUA_TSTRING: str = lua_tolstring(L, 3, &len); v = new ThreadVariant(str, len); break; case LUA_TLIGHTUSERDATA: v = new ThreadVariant(lua_touserdata(L, 3)); break; case LUA_TUSERDATA: v = new ThreadVariant(extractudatatype(L, 3), lua_touserdata(L, 3)); break; default: return luaL_error(L, "Expected boolean, number, string or userdata"); } t->set(name, v); t->lock(); v->release(); t->unlock(); return 0; }
int w_Thread_getName(lua_State *L) { Thread *t = luax_checkthread(L, 1); // allow names containing \0 luax_pushstring(L, t->getName()); return 1; }
int w_Thread_getError(lua_State *L) { LuaThread *t = luax_checkthread(L, 1); std::string err = t->getError(); if (err.empty()) lua_pushnil(L); else luax_pushstring(L, err); return 1; }
int w_Thread_set(lua_State *L) { Thread *t = luax_checkthread(L, 1); std::string name = luax_checkstring(L, 2); Variant *v = Variant::fromLua(L, 3); if (!v) return luaL_error(L, "Expected boolean, number, string or userdata"); t->set(name, v); t->lock(); v->release(); t->unlock(); return 0; }
int w_Thread_peek(lua_State *L) { Thread *t = luax_checkthread(L, 1); std::string name = luax_checklstring(L, 2); t->lock(); ThreadVariant *v = t->get(name); t->unlock(); if (!__pushThreadVariant(L, v)) return 1; t->lock(); v->release(); t->unlock(); return 1; }
int w_Thread_getKeys(lua_State *L) { Thread *t = luax_checkthread(L, 1); t->lock(); std::vector<std::string> keys = t->getKeys(); t->unlock(); lua_createtable(L, keys.size(), 0); int i = 1; for (std::vector<std::string>::iterator it = keys.begin(); it != keys.end(); it++) { lua_pushnumber(L, i++); luax_pushstring(L, *it); lua_settable(L, -3); } return 1; }
int w_Thread_peek(lua_State *L) { Thread *t = luax_checkthread(L, 1); std::string name = luax_checkstring(L, 2); t->lock(); Variant *v = t->get(name); t->unlock(); if (!v) { lua_pushnil(L); return 1; } v->toLua(L); t->lock(); v->release(); t->unlock(); return 1; }
int w_Thread_start(lua_State *L) { LuaThread *t = luax_checkthread(L, 1); std::vector<Variant> args; int nargs = lua_gettop(L) - 1; for (int i = 0; i < nargs; ++i) { args.push_back(Variant::fromLua(L, i+2)); if (args.back().getType() == Variant::UNKNOWN) { args.clear(); return luaL_argerror(L, i+2, "boolean, number, string, love type, or flat table expected"); } } luax_pushboolean(L, t->start(args)); return 1; }
int w_Thread_isRunning(lua_State *L) { LuaThread *t = luax_checkthread(L, 1); luax_pushboolean(L, t->isRunning()); return 1; }
int w_Thread_wait(lua_State *L) { LuaThread *t = luax_checkthread(L, 1); t->wait(); return 0; }
int w_Thread_start(lua_State *L) { Thread *t = luax_checkthread(L, 1); t->start(); return 0; }
int w_Thread_kill(lua_State *L) { Thread *t = luax_checkthread(L, 1); t->kill(); return 0; }