永井@知能.九工大です.

From: H.Yamamoto <ocean / m2.ccsnet.ne.jp>
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