From: Masahiro S. ()
<sa...@to...> - 2006-05-27 04:35:17
|
酒井です。 From: Kouhei Sutou <ko...@co...> Date: Sat, 27 May 2006 13:15:51 +0900 (JST) > 須藤です. > > 私はあまり効率にこだわらないタイプです.ごめんなさい. > > In <200...@to...> > "[ruby-gnome2-devel-ja] rbgobj_closure.c について質問" on Sat, 27 May 2006 13:01:00 +0900 (JST), > Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > > > > #define CALLBACK_KEY rb_str_new2("callback") > > > #define EXTRA_ARGS_KEY rb_str_new2("extra_args") > > > > としていますが、これだと CALLBACK_KEY や EXTRA_ARGS_KEY が使われるごとに > > rb_str_new2することになって効率が悪いのではないでしょうか? > > 常にメモリ上にもっておくことが嫌だったのでこうしました. > こだわっていないのでグローバルに持つようにしてもらってかまい > ません. この場合の正解は、callbackとextra_argsをGRClosureHolderのフィールドに 持つようにして、markすることだと思います。 > > > 2006-04-15 Kouhei Sutou <ko...@co...> > > > > > > * src/rbgobj_closure.c (rclosure_marshal, rclosure_marshal_body): > > > Changed an argument type to VALUE from struct marshal_arg *. > > > > この変更は何のためなのでしょうか? > > VALUEにキャストしたりして強引(でもないですが)に呼び出すの > が気持ち悪かったのでこうしました. なるほど。 > > 以前の struct marshal_arg をスタックに確保するコードに比べて、 > > ヒープに struct marshal_arg を確保する分遅くなります。 > > そういうことは全然考えていませんでした.revertしてかまいませ > ん. 効率はともかく、それ以外でもまずいことになっているのに気づいたので、 revertさせてください。 Sjoerd Simons の言うように別スレッドでrclosure_marshalが呼ばれること があるとすると、Data_Make_StructでRubyのオブジェクトを割り当てるべき ではないです。Data_Make_StructでGCが発生した場合にまずいし、 またData_Make_Structしてからメインスレッドにそのオブジェクトが渡るまでの 間はGCから保護されなくてまずいので。 -- 酒井 政裕 / Masahiro Sakai |