void ExecuteTaskThread(void *arg) { ScheduleTask *task = (ScheduleTask*)arg; lua_rawgeti(task->L, LUA_REGISTRYINDEX, task->callbackRef); luaM_pcall(task->L, 0, 1); void* res = lua_touserdata(task->L, -1); if (res == STOP || task->interval == 0) { DestroyTask(task); return; } { mir_cslock lock(threadLock); time_t timestamp = time(NULL); if(task->timestamp + task->interval >= timestamp) task->timestamp += task->interval; else task->timestamp = timestamp + task->interval; tasks.insert(task); } SetEvent(hScheduleEvent); }
void CMLuaScript::Unload() { if (status == Loaded) { lua_rawgeti(L, LUA_REGISTRYINDEX, unloadRef); if (lua_isfunction(L, -1)) luaM_pcall(L); lua_pushnil(L); lua_rawsetp(L, LUA_REGISTRYINDEX, this); status = None; } luaL_getsubtable(L, LUA_REGISTRYINDEX, "_LOADED"); lua_pushnil(L); lua_setfield(L, -2, moduleName); lua_pop(L, 1); KillModuleIcons(id); KillModuleSounds(id); KillModuleMenus(id); KillModuleHotkeys(id); KillObjectEventHooks(this); KillObjectServices(this); }
void __cdecl ThreadFunc(void *p) { core_ForkThreadParam *ftp = (core_ForkThreadParam*)p; lua_rawgeti(ftp->L, LUA_REGISTRYINDEX, ftp->functionRef); luaM_pcall(ftp->L, 0, 1); DestroyThread(ftp); }
static int schedule_Do(lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); luaL_checktype(L, 2, LUA_TFUNCTION); lua_pushvalue(L, 1); lua_pushcclosure(L, fluent_Do, 1); lua_pushvalue(L, 2); luaM_pcall(L, 1); return 0; }
int CMLua::HookEventObjParam(void *obj, WPARAM wParam, LPARAM lParam, LPARAM param) { lua_State *L = (lua_State*)obj; int ref = param; lua_rawgeti(L, LUA_REGISTRYINDEX, ref); lua_pushlightuserdata(L, (void*)wParam); lua_pushlightuserdata(L, (void*)lParam); luaM_pcall(L, 2, 1); int res = (int)lua_tointeger(L, 1); return res; }
INT_PTR CreateServiceFunctionObjParam(void *obj, WPARAM wParam, LPARAM lParam, LPARAM param) { lua_State *L = (lua_State*)obj; int ref = param; lua_rawgeti(L, LUA_REGISTRYINDEX, ref); lua_pushlightuserdata(L, (void*)wParam); lua_pushlightuserdata(L, (void*)lParam); luaM_pcall(L, 2, 1); INT_PTR res = lua_tointeger(L, 1); lua_pushinteger(L, res); return res; }
int HookEventObjParam(void *obj, WPARAM wParam, LPARAM lParam, LPARAM param) { lua_State *L = (lua_State*)obj; int ref = param; lua_rawgeti(L, LUA_REGISTRYINDEX, ref); if (wParam) lua_pushlightuserdata(L, (void*)wParam); else lua_pushnil(L); if (lParam) lua_pushlightuserdata(L, (void*)lParam); else lua_pushnil(L); luaM_pcall(L, 2, 1); return lua_tointeger(L, 1); }
bool CMLuaScript::Load() { status = Failed; if (luaL_loadfile(L, T2Utf(filePath))) { Log(lua_tostring(L, -1)); return false; } lua_createtable(L, 0, 2); lua_pushvalue(L, -1); lua_setfield(L, -2, "_G"); lua_pushlightuserdata(L, this); lua_setfield(L, -2, "Script"); lua_createtable(L, 0, 2); lua_getglobal(L, "_G"); lua_setfield(L, -2, "__index"); lua_setmetatable(L, -2); lua_setupvalue(L, -2, 1); if (luaM_pcall(L, 0, 1)) return false; status = Loaded; if (lua_isnoneornil(L, -1)) return true; luaL_getsubtable(L, LUA_REGISTRYINDEX, "_LOADED"); lua_getfield(L, -1, moduleName); if (!lua_toboolean(L, -1)) { lua_pop(L, 1); lua_pushvalue(L, -2); lua_setfield(L, -2, moduleName); lua_pop(L, 1); } else lua_remove(L, -2); if (!lua_istable(L, -1)) return true; lua_getfield(L, -1, "Load"); if (lua_isfunction(L, -1)) luaM_pcall(L); else lua_pop(L, 1); lua_getfield(L, -1, "Unload"); if (lua_isfunction(L, -1)) { lua_pushvalue(L, -1); unloadRef = luaL_ref(L, LUA_REGISTRYINDEX); } lua_pop(L, 1); lua_pop(L, 1); return true; }