例外フレーム
今日は、MinGW版action_gameが終了時にクラッシュすることに気が付いてデバッグしていました。
デバッグ中にSjLj例外の環境でコルーチン側の例外フレームがリークするバグが見つかったので修正しました。
coroutine_template.hppの差分
問題の箇所はココです。
void startup(const boost::false_type&) { self self(this); try { // ... } catch (...) { } result_ = boost::none; state_ = coro_detail::exited; swap_context(callee_, caller_, detail::default_hint()); }
最後のswap_context()呼び出しは例外フレームのスタックが空になっている必要があるのですが、(少なくともg++では)例えcatch節の外側であっても、まだ例外フレームが残っているようです。
なので、
void startup(const boost::false_type&) { self self(this); try { // ... } catch (...) { } result_ = boost::none; } void cleanup() { state_ = coro_detail::exited; swap_context(callee_, caller_, detail::default_hint()); }
のように分離して、これらの関数を続けて呼ぶように修正しました。
しかし、action_gameは相変わらずクラッシュします。
コルーチンの終了処理でexit_exception()を送出する際にクラッシュすることが多いのですが、それ以外の場所で発生することもあり原因は特定できていません。
コルーチンとは関係ないのかもしれません。