Я использую систему обратного вызова Lua 5.3 в моей C-программе.Скрипт Lua запускается только один раз, чтобы зарегистрировать обратные вызовы.Я бы хотел, чтобы обратные вызовы не были GC'd, без полного отключения GC.
Код обратного вызова:
LuaEventHandler* presentEvent = FindLuaEvent("present");
if (presentEvent != NULL) {
lua_rawgeti(lState, LUA_REGISTRYINDEX, presentEvent->luaFuncRef);
lua_pushvalue(lState, 1);
lua_pcall(lState, 0, 0, 0);
//presentEvent->luaFuncRef = luaL_ref(lState, LUA_REGISTRYINDEX);
}
Код добавления обратного вызова:
LUACFUNCTION(RegisterCallbackLua) {
int ref = luaL_ref(lState, LUA_REGISTRYINDEX);
const char* name = luaL_checkstring(lState, 1);
RegisterLuaEvent(ref, name);
return 0;
}
LuaEventHandler* RegisterLuaEvent(int pLuaFuncRef, const char* pEventName) {
LuaEventHandler* eventHandler = new LuaEventHandler();
eventHandler->luaFuncRef = pLuaFuncRef;
eventHandler->eventName = pEventName;
printf("Callback registered: %s\n", pEventName);
for (int i = 0; i < 64; i++) {
if (luaEventHandlerList[i] != 0)
continue;
luaEventHandlerList[i] = eventHandler;
break;
}
return eventHandler;
}