[ruby-dev:31837] Re: Kernel#` is blocked with Ruby/GLib2 on Intel Mac

From: Kouhei Sutou <kou@...>
Date: 2007-09-24 04:33:20 UTC
List: ruby-dev #31837
須藤です。

さらに補足です。

> 補足です。
> 
> > 1.8.6-p110でも再現するかどうかはわからないのですが、(たぶん)
> > Intel Mac上でrequire 'glib2'した状態でKernel#`を使うとブロッ
> > クするみたいです。
> > 
> >   require 'glib2'
> >   `date`
> > 
> >   http://www.cozmixng.org/~w3ml/index.rb/rabbit-shockers/msg/406
> >   # メール本文がUTF-8だったので文字化けしています。
> >   # 手動でブラウザのエンコーディングをUTF-8にしてください。
> > 
> > 
> > で、原因はproc_exec_v()の中の
> > 
> >   rb_thread_cancel_timer();
> > 
> > らしいです。
> >   http://www.cozmixng.org/~w3ml/index.rb/rabbit-shockers/msg/411
> > 
> > 
> > 
> > で、ここらへんが関係があるみたいです。
> >   http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/10580
> >   http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/30581
> > 
> 
> このrb_thread_cancel_timer()の修正はruby_1_8には入っていなく
> てruby_1_8_6にだけ入っています。
> 

原因はこんな感じらしいです。

> 親でtimer thread 起動→fork→exec
>
> という流れなんですが、fork した後も timer_thread のIDとかを持った変数は
>
> そのまま引き継がれてるけど、fork した後にはそのthreadは存在しない。
> ありもしないthreadに対して、pthread_join()してしまうわけです。
> 大抵の場合はエラーになるんだろうけど、ある状況ではたまたま呼び出しが
> 成功して、ありもしないthreadを待ち続けて、帰って来なくなる・・・。

  http://www.cozmixng.org/~w3ml/index.rb/rabbit-shockers/msg/414


で、こんなので解決するらしいです。

> forkしたときに、timer_thread がないものにしてしまえばいいので、
> eval.c に
>
>
> static void
> clear_time_thread()
> {
>      thme_thread_alive_p = 0;
> }
>
> こんな関数を追加して、
>
>          pthread_create(&time_thread, 0, thread_timer, 0);
>
> の前に、
>
>          pthread_atfork(NULL, NULL, clear_time_thread);
>
> を追加したら、動くようになりました。

  http://www.cozmixng.org/~w3ml/index.rb/rabbit-shockers/msg/414



# ショッカーは優秀だ。

In This Thread