Project

General

Profile

Actions

Bug #4027

closed

Signal.trap で busy loop に陥る

Added by nagachika (Tomoyuki Chikanaga) about 14 years ago. Updated over 13 years ago.

Status:
Rejected
Assignee:
-
Target version:
-
ruby -v:
ruby 1.9.3dev (2010-10-29 trunk 29626) [i686-linux]
Backport:

Description

=begin
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
=end


Files

sigchldtest.rb (762 Bytes) sigchldtest.rb nagachika (Tomoyuki Chikanaga), 11/05/2010 07:39 PM
sigmask.patch (2.34 KB) sigmask.patch nagachika (Tomoyuki Chikanaga), 11/11/2010 01:33 AM

Subtasks 1 (0 open1 closed)

Bug #4765: signal が正しくマスクされておらず main thread でシグナルハンドラが動いているClosedkosaki (Motohiro KOSAKI)05/23/2011Actions

Related issues 1 (0 open1 closed)

Related to Ruby master - Bug #4072: dRubyで作成したサーバプログラムがsleepしていてもexitしてしまうClosedmatz (Yukihiro Matsumoto)11/19/2010Actions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0