[#42564] [Ruby 1.9-Feature#4043][Open] グローバル関数current_classの提案 — Makoto Kishimoto <redmine@...>

Feature #4043: =E3=82=B0=E3=83=AD=E3=83=BC=E3=83=90=E3=83=AB=E9=96=A2=E6=95=

15 messages 2010/11/11
[#42774] Re: [Ruby 1.9-Feature#4043][Open] グローバル関数current_classの提案 — Yukihiro Matsumoto <matz@...> 2010/12/16

まつもと ゆきひろです

[#42834] Re: [Ruby 1.9-Feature#4043][Open] グローバル関数current_classの提案 — "KISHIMOTO, Makoto" <ksmakoto@...4u.or.jp> 2010/12/21

きしもとです

[#42835] Re: [Ruby 1.9-Feature#4043][Open] グローバル関数current_classの提案 — Yukihiro Matsumoto <matz@...> 2010/12/21

まつもと ゆきひろです

[#42838] Re: [Ruby 1.9-Feature#4043][Open] グローバル関数current_classの提案 — "KISHIMOTO, Makoto" <ksmakoto@...4u.or.jp> 2010/12/21

きしもとです

[#42845] Re: [Ruby 1.9-Feature#4043][Open] グローバル関数current_classの提案 — Yukihiro Matsumoto <matz@...> 2010/12/21

まつもと ゆきひろです

[#42577] Rubyのバグレポートのガイドライン — "Shota Fukumori (sora_h)" <sorah@...>

sora_hです。

11 messages 2010/11/15
[#42588] Re: Rubyのバグレポートのガイドライン — Yugui <yugui@...> 2010/11/18

2010/11/15 Shota Fukumori (sora_h) <sorah@tubusu.net>:

[#42638] Enumerable#categorize — Tanaka Akira <akr@...>

enumerable から hash を生成するメソッドとして

25 messages 2010/11/27
[#42643] Re: Enumerable#categorize — Yukihiro Matsumoto <matz@...> 2010/11/27

まつもと ゆきひろです

[ruby-dev:42540] [Ruby 1.9-Bug#4027][Open] Signal.trap で busy loop に陥る

From: Tomoyuki Chikanaga <redmine@...>
Date: 2010-11-05 10:40:46 UTC
List: ruby-dev #42540
Bug #4027: Signal.trap で busy loop に陥る
http://redmine.ruby-lang.org/issues/show/4027

起票者: Tomoyuki Chikanaga
ステータス: Open, 優先度: Normal
カテゴリ: core
ruby -v: ruby 1.9.3dev (2010-10-29 trunk 29626) [i686-linux]

Signal.trap のシグナルハンドラ内で Mutex(Monitor) を用いる調査をしていて
稀にインタプリタが CPU を占有して busy loop 状態になることがありました。

あまり小さく絞れていませんが再現させたスクリプトを添付します。
元々はこれで時々 ThreadError: deadlock; recursive locking になるのを
避ける方法を考えるために実験していたのですが、ごく稀にインタプリタが止まり、
gdb attach すると下記のスタックトレースを得ました。

環境は
 Red Hat Enterprise Linux ES release 3 (Taroon Update 8)
 Linux 2.4.21-47.ELsmp #1 SMP Wed Jul 5 20:38:41 EDT 2006 i686 i686 i386 GNU/Linux
です。

また signal_buff という変数の内容がおかしいと思い表示させてみると

(gdb) p signal_buff
$1 = {cnt = {0 <repeats 65 times>}, size = -1}

のように signal_buff.size がアンダーフローしているようです。
sighandler() で signal_buff.cnt[sig] と signal_buff.size を increment しているところを
rb_disable_interrupt() で保護しないといけないのでしょうか?
そのようなパッチを当てて追試してみて今のところ再現していませんが、
元々なかなか起きていなかったので直ったのかははっきりしません。

(gdb) where
#0  0x00cb3007 in sched_yield () from /lib/tls/libc.so.6
#1  0x081524fc in rb_threadptr_execute_interrupts_rec (th=0x83da590, sched_depth=0) at thread.c:1253
#2  0x081526d7 in rb_threadptr_execute_interrupts (th=0x83da590) at thread.c:1318
#3  0x0814819c in vm_call0 (th=0x83da590, recv=0, id=792, argc=0, argv=0x0, me=0x84140a8) at vm_eval.c:146
#4  0x08148f19 in rb_call0 (recv=0, mid=792, argc=0, argv=0x0, scope=CALL_FCALL, self=6) at vm_eval.c:235
#5  0x08148e6c in rb_call (recv=0, mid=792, argc=0, argv=0x0, scope=CALL_FCALL) at vm_eval.c:438
#6  0x08148fb8 in rb_funcall (recv=0, mid=792, n=0) at vm_eval.c:637
#7  0x0808c997 in rb_obj_inspect (obj=0) at object.c:442
#8  0x08144949 in call_cfunc (func=0x808c83d <rb_obj_inspect>, recv=0, len=0, argc=0, argv=0x0) at vm_insnhelper.c:319
#9  0x08147e8a in vm_call0 (th=0x83da590, recv=0, id=800, argc=0, argv=0x0, me=0x8410700) at vm_eval.c:79
#10 0x08148f19 in rb_call0 (recv=0, mid=800, argc=0, argv=0x0, scope=CALL_FCALL, self=6) at vm_eval.c:235
#11 0x08148e6c in rb_call (recv=0, mid=800, argc=0, argv=0x0, scope=CALL_FCALL) at vm_eval.c:438
#12 0x08148fb8 in rb_funcall (recv=0, mid=800, n=0) at vm_eval.c:637
#13 0x0808c5cf in rb_inspect (obj=0) at object.c:356
#14 0x0807811d in rb_p (obj=0) at io.c:6196
#15 0x08078279 in rb_f_p (argc=1, argv=0xb7282028, self=138456320) at io.c:6234
#16 0x08144936 in call_cfunc (func=0x8078245 <rb_f_p>, recv=138456320, len=-1, argc=1, argv=0xb7282028) at vm_insnhelper.c:316
#17 0x08144821 in vm_call_cfunc (th=0x83da590, reg_cfp=0xb7301f84, num=1, recv=138456320, blockptr=0x0, me=0x84461f0) at vm_insnhelper.c:403
#18 0x08143f49 in vm_call_method (th=0x83da590, cfp=0xb7301f84, num=1, blockptr=0x0, flag=8, id=6160, me=0x84461f0, recv=138456320) at vm_insnhelper.c:525
#19 0x0814122d in vm_exec_core (th=0x83da590, initial=0) at insns.def:1006
#20 0x0814d1f4 in vm_exec (th=0x83da590) at vm.c:1142
#21 0x0814db49 in rb_iseq_eval_main (iseqval=138364160) at vm.c:1383
#22 0x0805c74d in ruby_exec_internal (n=0x83f4500) at eval.c:214
#23 0x0805c858 in ruby_exec_node (n=0x83f4500) at eval.c:261
#24 0x0805c82c in ruby_run_node (n=0x83f4500) at eval.c:254
#25 0x0805b190 in main (argc=2, argv=0xbfffa164) at main.c:35


----------------------------------------
http://redmine.ruby-lang.org

Attachments (1)

sigchldtest.rb (762 Bytes, text/x-ruby)
require "monitor"

class Test
  include MonitorMixin

  def initialize
    mon_initialize
    @cond = new_cond
    @flag = false
    @thread = nil
  end

  attr_reader :flag

  def start
    @thread = Thread.start do
      synchronize do
        while true
          @cond.wait_until{ @flag }
          @flag = false
          begin
            while true
              Process.wait
            end
          rescue Errno::ECHILD
          end
        end
      end
    end
  end

  def set_signal_handler
    Signal.trap(:CHLD) do
      synchronize do
        @flag = true
        @cond.signal
      end
    end
  end
end

o = Test.new
o.set_signal_handler
o.start

while true
  1000.times do
    Process.spawn("ls > /dev/null")
  end
  sleep 1
  p o.flag
end

In This Thread

Prev Next