Как предотвратить обратный вызов Lua в реестре C API для сбора мусора? - PullRequest
1 голос
/ 25 июня 2019

Я использую систему обратного вызова 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...