How can I end a Lua thread cleanly?

前端 未结 2 1022
青春惊慌失措
青春惊慌失措 2020-12-16 07:14

My situation is that I\'m using the Lua (C) API to execute a script held in a string. I would like the user to be able to terminate the execution of the script (this is esse

相关标签:
2条回答
  • 2020-12-16 07:42

    Hook on lines is not enough. This code is a single line, but loops forever:

        while true do end
    

    You need to set an instruction count hook. If I'm not mistaken, that would be

        lua_sethook(Lua, &LineHookFunc, LUA_MASKCOUNT, NUM_INSTRUCTIONS);
    

    You want to pick NUM_INSTRUCTIONS so it is not too small (or you get a performance overhead) and not too large (or you'll wait too long until stop).

    For related Lua-only implementation please see this library.

    If you want to add more protection from untrusted Lua code, google for "Lua sandboxing" -- there is more to it than just infinite loop prevention.

    0 讨论(0)
  • 2020-12-16 07:44

    You can use a hook to callback to C every time lua executes a line of the script. In this hook function you can check if the user wanted to quit, and call lua_error if they did.

    static bool ms_quit = false;
    
    void IWantToQuit()
    {
        ms_quit = true;
    }
    
    void LineHookFunc(lua_State *L, lua_Debug *ar)
    {
        if(ar.event == LUA_HOOKLINE)
            if(ms_quit == true)
                luaL_error(L, "Too Many Lines Error");
    }
    //...
    
    lua_State *Lua = lua_open();
    char * code;
    // Initialisation code
    lua_sethook(Lua, &LineHookFunc, LUA_MASKLINE, 0);
    luaL_dostring(L, code);
    
    0 讨论(0)
提交回复
热议问题