From: SASADA Koichi Date: 2010-10-29T00:28:50+09:00 Subject: [ruby-dev:42479] rb_objspace_call_finalizer() is called twice  ささだです。  現在、gc.c の何カ所かで finalizer_table の NULL check をしています。こ れは無駄なので、最初に一回 finalizer_table を初期化、最後に解放してやれ ば、これらのチェックは不要になるように思いました。  で、やってみたら SEGV。  finalizer_table を rb_objspace_call_finalizer() で解放するようにしたん ですが、こいつが 2 回呼ばれています。そのため、おかしなことになっている。 - VM の終了処理で、rb_objspace_free() から - Ruby プロセスの終了処理で、rb_gc_call_finalizer_at_exit() から  この関数自体は、強制的にファイナライザを呼ぶってことだと思うんですが、 今の状況(2回呼ばれる)は正しいのでしょうか。わざわざ _atexit() ってのを 別に用意しているってことは、これ自体は何度呼ばれても良いはずってことかし らん。しかし、これって生きているオブジェクトにくっついているファイナライ ザも強制的に呼ぶはずなので、やはり1回しか(最後にしか)呼んじゃいけない ような。  というわけで、なんかこの辺整理できてない気がします。static じゃないの もよくわからない。どうあるべきでしょう。 # あと、今 win32 以外で ENABLE_VM_OBJSPACE が 1 なのは、 # なぜでしょうか。 -- // SASADA Koichi at atdot dot net