From: Tietew Date: 2002-08-21T13:52:20+09:00 Subject: [ruby-dev:18052] [Bug] rb_thread_create sometimes returns 0 Tietew です。 次のコードで,rb_thread_create が 0 を返す(rb_thread_start_0 の コメントで not reached となっている部分を通過する!)ために undefined method `value' for false (NameError) という意味不明な例外が発生してしまうことがあります。 ここで最終的に rb_load しようとしているスクリプトにはただ一行 raise と書いてあるものです。また,メインスレッドの他に走っているスレッ ドはありません。 struct thread_call_t { RB_CALLBACK fn; VALUE arg; }; static VALUE thread_call_main(VALUE v) { thread_call_t *call = (thread_call_t *)v; VALUE th = rb_thread_create(RUBY_METHOD_FUNC(call->fn), (void*)call->arg); return rb_funcall(th, rb_intern("value"), 0); } static VALUE protect_thread_call(RB_CALLBACK fn, VALUE arg, int *state) { thread_call_t call = { fn, arg }; return rb_protect(RB_CALLBACK(thread_call_main), (VALUE)&call, state); } static VALUE run_script_main_body(VALUE fname) { rb_load(fname, true); return Qnil; } static VALUE run_script_main_rescue(VALUE, VALUE) { return Qnil; } static VALUE run_script_main(VALUE fname) { fname = rb_str_new2((const char *)fname); return rb_rescue2(RUBY_METHOD_FUNC(run_script_main_body), fname, RUBY_METHOD_FUNC(run_script_main_rescue), Qnil, rb_eSystemExit, NULL); } static void run_script(const char *fname) { int state; protect_thread_call(RB_CALLBACK(run_script_main), (VALUE)fname, &state); if(state != 0) console_write_err(get_ruby_error_info(state)); } /* run_script("foo.rb"); のように呼ばれる */ 解決策は rb_thread_start_0 の最後で return 0; じゃなくて return thread; にすればいいんじゃないかと思うんですが,確信が持 てません。 —[ Tietew ]—————————————————————————— メ : tietew@tietew.net / tietew@raug.net / tietew@masuclub.net ホペ: http://www.tietew.net/ Tietew Windows Lab. http://www.masuclub.net/ 鱒倶楽部 指紋: 26CB 71BB B595 09C4 0153 81C4 773C 963A D51B 8CAA