From: Katsuyuki Komatsu Date: 1999-07-15T12:12:12+09:00 Subject: [ruby-dev:7309] Re: mod_ruby/0.1.2 with Apache/1.3.6 on Solaris/2.5.1 小松です。 In [ruby-dev:7305] Re: mod_ruby/0.1.2 with Apache/1.3.6 on Solaris/2.5.1 on 1999/7/13 11:16:50 matz@netlab.co.jp (Yukihiro Matsumoto) wrote: ||なんだか1回しか通ってないみたいですが。 | |それが根本的な原因です。つまり、2回通るはずの1回目がなぜだか |バイパスされちゃってるんですね。それでなされるべき初期化が行 |われずに落ちると。しかし、なんでHP-UXに限って1回目が呼ばれな |いのか全然分かりません。 どうやらruby_init()が2回呼ばれた形になっているためのようです。 (1) ruby_startup() → ruby_init() (2) httpdのfork() (3) ruby_startup() → ruby_init() この(3)でlibruby.slは(1)の状態を引き継いでいて、 curr_thread != 0 になっていました。 初期化し過ぎか、2回目のruby_init()の初期化不足のようですね。 ということで、 (a) 2回目の初期化をバイパスする。 (b) 2回目のruby_init()の初期化不足を補う。 という案が考えられると思います。 別な案としてmod_ruby.soでstaticな変数を用意して初期化を バイパスする (ruby_init()を呼ばない) ようにしようとして みましたが、動きませんでした。 # このへんのapacheの仕組みはよく分からない。 # mod_ruby.soはloadし直されているということ? HP-UX 10.20で、 apache_1.3.6 mod_ruby-0.1.3 ruby-1.3.4-990625 で動作確認しましたが、他のプラットフォームは試してません。 / / / (a) 2回目の初期化をバイパスする。 --- eval.c.dist Fri Jun 25 18:02:34 1999 +++ eval.c Wed Jul 14 23:45:33 1999 @@ -886,10 +886,15 @@ void Init_ext _((void)); void ruby_init() { + static int initialized = 0; static struct FRAME frame; static struct iter iter; int state; + if (initialized) + return; + initialized = 1; + ruby_frame = top_frame = &frame; ruby_iter = &iter; / / / (b) 2回目のruby_init()の初期化不足を補う。 --- eval.c.dist Fri Jun 25 18:02:34 1999 +++ eval.c Wed Jul 14 23:46:31 1999 @@ -7276,6 +7276,7 @@ Init_Thread() rb_define_method(rb_cThread, "key?", rb_thread_key_p, 1); /* allocate main thread */ + curr_thread = 0; main_thread = rb_thread_alloc(rb_cThread); rb_cContinuation = rb_define_class("Continuation", rb_cObject); --- gc.c.dist Fri Jun 25 18:02:41 1999 +++ gc.c Wed Jul 14 23:46:20 1999 @@ -962,6 +962,10 @@ Init_stack(addr) if (!addr) addr = &start; rb_gc_stack_start = addr; #endif + Global_List = 0; + freelist = 0; + heaps_length = 0; + heaps_used = 0; } void -- 小松克行 / Katsuyuki Komatsu