Вы можете установить переменную где-нибудь в вашей программе и назвать ее как forceQuitLuaScript
. Затем вы используете ловушку, описанную здесь для запуска каждой n
инструкции. После n
инструкций он запустит ваш хук, который просто проверяет, установлен ли forceQuitLuaScript
, и, если он выполняет какую-либо очистку, вам нужно выполнить и убить поток.
Редактировать: Вот дешевый пример того, как это может работать, только это однопоточное. Это просто, чтобы проиллюстрировать, как вы можете обрабатывать pcall и такие:
#include <stdlib.h>
#include "lauxlib.h"
void hook(lua_State* L, lua_Debug *ar)
{
static int countdown = 10;
if (countdown > 0)
{
--countdown;
printf("countdown: %d!\n", countdown);
}
else
{
// From now on, as soon as a line is executed, error
// keep erroring until you're script reaches the top
lua_sethook(L, hook, LUA_MASKLINE, 0);
luaL_error(L, "");
}
}
int main(int argc, const char *argv[])
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);
lua_sethook(L, hook, LUA_MASKCOUNT, 100);
// Infinitely recurse into pcalls
luaL_dostring(L, "function test() pcall(test) print 'recursing' end pcall(test)");
lua_close(L);
printf("Done!");
return 0;
}