多个 lua_call 退出并且生成 "C stack overflow"

我在一个多进程环境中使用 C++ 并进行一些 Lua 绑定,使用 Lua 函数来管理进程的某些方面,其中共享一个 Lua 上下文。

我使用的一般形式是通过钩住某些事件,触发 Lua 函数,从而达到 C++ 代码的目的。

我将两个与进程相关的参数推到堆栈上,然后发出

lua_call(L,2,0);

问题是一些特定的 lua_call到达一个终止函数(预期行为),但由于 lua_call不返回,堆栈没有得到释放。在大约200个这样的调用之后,Lua由于 C 栈溢出而出现故障。

我在每个钩子处打印了 Lua 堆栈并看到它在增长。我尝试在 Lua 消耗参数并发出回调之后,在杀死进程之前使用 lua_pop(L,2)(每次堆栈增加2),lua_settop(L,0) ,但没有效果。

我不能调用 lua_close(L) 因为那会破坏在进程之间共享的上下文,并导致其他进程访问空上下文。

点赞
用户4679579
用户4679579

我的解决方法是,在不直接终止发出lua_call指令的进程的情况下,我设置了一个标志,并在调用返回后才终止它,确保没有剩余的堆栈桢。

再次感谢Chris Beck对Lua堆栈工作方式的深刻评论。

2016-07-12 12:36:10