Rubyの終了時処理

DXRubyでは、DirectXの基本的なインターフェースを初期化の時に取得して、Rubyのオブジェクトを生成するときに、それぞれ個別に必要なインターフェースを取得するようにしている。
で、GCにより解放されるタイミングで、個別のほうを解放して、Rubyの終了時に全体で使うぶんを解放しようとしている。
うん、しようとしている。


Rubyの拡張ライブラリ用インターフェースでは、rb_set_end_proc()を使って、終了時に呼び出される関数を登録する。
らしい。
README.EXT.jaに書いてないからよくわからん。
何を見てこれを使おうと思ったのかも、昔のことすぎてよくわからん(゜▽゜;)
StarRubyでも使ってるみたいだからいいんじゃないかと思う。
いろんな場面で参考にさせてもらっております。
ほんとはDirectXを使うライブラリがあれば一番いいんだけど、そんなものがあったらDXRubyなんか作ってない気はする。


ところが、だ。
音まわりをいじっていると、Ruby終了時にGCのタイミングでコケるのだ。
なんでかなあ・・・って思って調べていたら、なんと、GCでの回収より、rb_set_end_procで登録した関数のほうが先に呼ばれてるではないか。
そりゃあ、親が既に解放されてれば、子のほうは動けないわなー


これではrb_set_end_procが全体の終了に使えないのだが、この順番をどーにかする手があるのか。
また別の関数があるのか。
それとも個別のインターフェースは別にリストを作っておいて、GCか終了時か、はやいほうが解放するように作らないといけないのか。
なぜか一部そのような実装をしてるところもあったりしてて、DXRuby自体も解放まわりは混沌としている。
はて。
どーしたもんか。