dla*_*ask 5 lua multithreading
我必须在嵌入式多线程环境中安全地运行Lua会话,其中线程堆栈是预先分配的并且具有固定大小.
由于高C/C++堆栈消耗,允许脚本在Lua级别失败.
它不允许整个应用程序在C/C++级别崩溃.
我不能依赖LUAI_MAXCCALLS和MAXCCALLS提供的检查.
什么是检查和防止Lua会话的任何潜在堆栈溢出的正确方法?
在哪里实施这种检查的正确位置是什么?
Ken*_*ima -1
您可以将要调用的 C 函数包装在外部 C 闭包中,检查您的 C/C++ 堆栈。闭包将包含引用实际要调用的 C 函数的 upvalue:
CFunctionThunk(lua_state* l)
{
Check available stack space.
if( available stack space < minimum stack space required )
{
panic(...);
}
else
{
actualFunction = retrieve upvalue;
actualFunction(l);
}
}
Run Code Online (Sandbox Code Playgroud)
这会将 thunk 所需的堆栈空间添加到实际调用的函数所需的堆栈空间中,但这应该很小且恒定。另外,在从一开始调用 Lua 之前,您应该确保剩余的 C 堆栈空间至少足以容纳您的 Lua VM 和两个 C 函数堆栈帧(thunk +实际)。您可以研究调试器中的堆栈指针,以找到 thunk 和 Lua VM 所需的空间量,该空间量应该(或多或少)保持不变。对堆栈空间的检查也可以简化为线程本地计数器,该计数器在 thunk 开始时递增,并在结束时递减。
另一种可能性是在函数调用上启用 Lua 调试挂钩,检查其中的 C 函数,并在需要时进行 C 堆栈检查。但这可能会降低运行时性能,因为脚本中 Lua 定义的函数也会调用该钩子。