From: Hidetoshi NAGAI Date: 2005-04-12T00:18:10+09:00 Subject: [ruby-dev:26020] Re: tnono dumps core 永井@知能.九工大です. From: H.Yamamoto Subject: [ruby-dev:26016] Re: tnono dumps core Date: Mon, 11 Apr 2005 20:58:46 +0900 Message-ID: <20050411205827.1209FDA0.ocean@m2.ccsnet.ne.jp> > http://tmml.sourceforge.net/doc/tcl/CExit.html に > > No-one should ever invoke the exit system procedure directly; > always invoke Tcl_Exit instead, so that it can invoke exit handlers. > > と書いてあったのですが、これは関係ないでしょうか? Tcl_Exit を呼んでしまうと Ruby の終了処理をすることなく Ruby ごと終了してしまうので,これを呼ぶわけにはいかないです. 必要なのは, ・Tcl/Tk の exit コマンドを呼んだ場合はその IP だけが終了する. ・マスター IP での callback 中で Ruby の exit が呼ばれた時は Ruby と IP とを含めたプログラム全体を正常に終了させる. ・スレーブ IP での callback 中で Ruby の exit が呼ばれた時は IP に設定する許可モードに応じて IP のみか,プログラム全体かを 正しく終了させる. ・IP が GC で回収される時には, マスター IP であれば IP を正常に終了させた上で回収させ, スレーブ IP であれば IP オブジェクトのみを回収させる ( スレーブ IP はマスター IP からアクセスできるため ). というように動作し,かつ, ・Ruby 側で設定した IP 終了時の callback を 適切に呼び出せるようにする. ( Tcl/Tk の interp delete コマンドで消される場合を含む.) ことです (他にもあったもしれません). 最後の条件は Tcl_CallWhenDeleted で callback の launcher を 登録しておけば十分であるように見えるかもしれませんが, Tcl_CallWhenDeleted で登録したものはいつ呼ばれるか保証できないため, 実際に呼ばれるのが GC で回収された後になり正常に実行できないという 状況が生じる恐れがあってダメです. > # 何となく、これを使うと after cancel が必要なくなりそうな気がします。 複数の IP を動かして after の callback を登録している場合, IP 終了の際に after もキャンセルしておかないと 正常に終了したはずの IP に絡んでエラーメッセージが 出てしまうことがあるため,残念ながら安易に「不要」とは 言えないんです. もちろん,私が良い方法に気付いていないだけのことかもしれません. 良い方法があれば教えて頂けると助かります. -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp