Я люблю Lua. I love Lua.

Перехватчик для события удаления стейта.

Posted in Uncategorized by ilovelua on Февраль 11, 2014

Если Lua-библиотека, написанная на С, взаимодействует с несколькими Lua стейтами, то может потребоваться узнать о том, что какой-то из Lua стейтов удаляется. Сделать это можно так: при регистрации библиотеки в Lua стейте создаем безымянную userdata переменную, и у нее устанавливаем метатаблицу с методом __gc. Поскольку при удалении стейта у всех объектов вызываются финализаторы, то будет вызвана и эта функция безымянного объекта.

int onDestroyLuaState(lua_State* L)
{
	// делаем что-то полезное
	return 0;
}

const luaL_Reg libname[] = {
	// common functions
	{"Func1", func1},
	{"Func2", func2},
        ...
	{0, 0},
};

extern "C" __declspec(dllexport) int luaopen_libname(lua_State* L)
{
	lua_newuserdata(L, 0); // dummy for GC
	lua_createtable(L, 0, 1); // metatable
	lua_pushcfunction(L, onDestroyLuaState);
	lua_setfield(L, -2, "__gc");
	lua_setmetatable(L, -2);

	luaL_register(L, luaModuleName, libname);

	return 1;
}
Реклама
Tagged with: ,