2016-07-12 12 views
1

私はいくつかの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コンテキストにアクセスすることになるからです。

+0

最も簡単な解決策は、プロセス間でLuaコンテキストを共有しないことです。 (実際には、私はうまく動作しています) – immibis

+0

ある種のロックを使用する必要があります。一度に2つのスレッドを実行して、未定義の動作をしている場合は、ロックを使用する必要があります。 –

+0

なぜlua呼び出しが返されないのですか?これを行うと、スタックエントリが漏洩するという仕様と一致します。いくつかの引数を指定して "lua_call"を呼び出すと、関数呼び出しの下の引数はluaによって保護され、呼び出しをサポートするためにスタックフレームを仮想的に移動します。 「元の」スタックは、関数から戻るときにのみアクセス可能になります。あなたは最終的にコールから戻る必要がありますか、それらのエントリはAFAIK永遠に漏れています。 –

答えて

0

私の回避策は、lua_callを発行しているプロセスを強制終了させるのではなく、フラグを設定し、コールが戻ったときにのみ強制終了し、残りのスタックフレームがないことを確認します。

Luaスタックの仕組みに関する彼の洞察力の高いコメントにChris Beck氏に感謝します。

関連する問題