私はいくつかのLuaバインディングでC++を使用し、プロセスのいくつかの側面を管理するためにLua関数を使用して複数のプロセス環境で作業しています。複数のlua_callsを終了して "C stack overflow"を生成する
私が使用している一般的な形式は、特定のイベントをフックし、Lua関数をトリガしてC++コードに到達させることです。
私は、スタック上のプロセス関連のある二つの引数をプッシュし、問題がいくつかの特定のlua_call
はキル機能(意図した動作)に達するということですが、lua_call
にはないので、
lua_call(L, 2, 0);
を発行スタックは解放されません。約200回の呼び出しの後、CスタックのオーバーフローによるLuaパニックが発生します。
私はそれぞれのフックでLuaスタックを印刷しました。私はそれが成長するのを見ることができます。私はlua_pop(L, 2)
(スタックが2ずつ増加する)、lua_settop(L, 0)
を使用して試してみましたが、Luaは引数を消費し、プロセスを強制終了する直前にコールバックを発行しますが、役に立たなくなりました。
私はlua_close(L)
を呼び出すことができません。これは、プロセス間で共有されるコンテキストを破壊し、他のプロセスによってNULLコンテキストにアクセスすることになるからです。
最も簡単な解決策は、プロセス間でLuaコンテキストを共有しないことです。 (実際には、私はうまく動作しています) – immibis
ある種のロックを使用する必要があります。一度に2つのスレッドを実行して、未定義の動作をしている場合は、ロックを使用する必要があります。 –
なぜlua呼び出しが返されないのですか?これを行うと、スタックエントリが漏洩するという仕様と一致します。いくつかの引数を指定して "lua_call"を呼び出すと、関数呼び出しの下の引数はluaによって保護され、呼び出しをサポートするためにスタックフレームを仮想的に移動します。 「元の」スタックは、関数から戻るときにのみアクセス可能になります。あなたは最終的にコールから戻る必要がありますか、それらのエントリはAFAIK永遠に漏れています。 –