Bug #5343
closedUnexpected blocking behavior when interrupt Socket#accept
Description
In CentOS release 5.6 (Kernel: 2.6.18-238.12.1.el5, glibc 2.5),
the following sample script rarely (about once every 1000) blocks at Thread#join with 1.9.3-head.
require "socket"
require "thread"
queue = Queue.new
th = Thread.start {
s = TCPServer.new(10000)
queue.push(nil)
cli = s.accept
}
queue.pop
th.kill.join
Backtrace:
thread-1:
#0 0x0000003a3500aee9 in pthread_cond_wait@@GLIBC_2.3.2 ()
from /lib64/libpthread.so.0
#1 0x000000000052d81b in native_cond_wait (th=0x19551550, timeout_tv=0x0)
at ../ruby-1.9.3/thread_pthread.c:307
#2 native_sleep (th=0x19551550, timeout_tv=0x0)
at ../ruby-1.9.3/thread_pthread.c:908
#3 0x000000000052f9ab in sleep_forever (th=0x19551550, deadlockable=1)
at ../ruby-1.9.3/thread.c:855
#4 0x000000000052fa4d in thread_join_sleep (arg=140733838958496)
at ../ruby-1.9.3/thread.c:688
#5 0x0000000000417abb in rb_ensure (b_proc=0x52fa00 <thread_join_sleep>,
data1=140733838958496, e_proc=0x5288e0 <remove_from_join_list>,
data2=140733838958496) at ../ruby-1.9.3/eval.c:736
#6 0x000000000052a78e in thread_join (argc=,
argv=, self=)
at ../ruby-1.9.3/thread.c:721
#7 thread_join_m (argc=, argv=,
self=) at ../ruby-1.9.3/thread.c:802
#8 0x0000000000524b0d in vm_call_cfunc (th=0x19551550, cfp=0x2b38cc37df08,
num=, blockptr=,
flag=, id=, me=0x196663c0,
recv=427644560) at ../ruby-1.9.3/vm_insnhelper.c:404
#9 vm_call_method (th=0x19551550, cfp=0x2b38cc37df08,
num=, blockptr=,
flag=, id=, me=0x196663c0,
recv=427644560) at ../ruby-1.9.3/vm_insnhelper.c:530
#10 0x000000000051908d in vm_exec_core (th=0x19551550,
initial=) at ../ruby-1.9.3/insns.def:1015
#11 0x000000000051ed7e in vm_exec (th=0x19551550) at ../ruby-1.9.3/vm.c:1220
#12 0x0000000000525f9f in rb_iseq_eval_main (iseqval=427473840)
at ../ruby-1.9.3/vm.c:1461
#13 0x0000000000414c22 in ruby_exec_internal (n=0x197abbb0)
at ../ruby-1.9.3/eval.c:204
#14 0x00000000004172d4 in ruby_exec_node (n=)
at ../ruby-1.9.3/eval.c:251
#15 ruby_run_node (n=) at ../ruby-1.9.3/eval.c:244
#16 0x0000000000414689 in main (argc=2, argv=0x7fff267aa588)
at ../ruby-1.9.3/main.c:38
thread-2:
#0 0x0000003a344cb696 in poll () from /lib64/libc.so.6
#1 0x00000000005301ba in ppoll (fd=,
events=, tv=0x0) at ../ruby-1.9.3/thread.c:2820
#2 rb_wait_for_single_fd (fd=,
events=, tv=0x0) at ../ruby-1.9.3/thread.c:2849
#3 0x000000000053052c in rb_thread_wait_fd_rw (fd=5)
at ../ruby-1.9.3/thread.c:2686
#4 rb_thread_wait_fd (fd=5) at ../ruby-1.9.3/thread.c:2699
#5 0x00002aaaab0b7b6f in rsock_s_accept (klass=427743720, fd=5,
sockaddr=, len=0x40473a3c)
at ../../../ruby-1.9.3/ext/socket/init.c:499
#6 0x00002aaaab0c3310 in tcp_accept (sock=)
at ../../../ruby-1.9.3/ext/socket/tcpserver.c:55
#7 0x0000000000524b0d in vm_call_cfunc (th=0x197ffe90, cfp=0x2aaaab3d3f08,
num=, blockptr=,
flag=, id=, me=0x1980ba70,
recv=427644480) at ../ruby-1.9.3/vm_insnhelper.c:404
#8 vm_call_method (th=0x197ffe90, cfp=0x2aaaab3d3f08,
num=, blockptr=,
flag=, id=, me=0x1980ba70,
recv=427644480) at ../ruby-1.9.3/vm_insnhelper.c:530
#9 0x000000000051908d in vm_exec_core (th=0x197ffe90,
initial=) at ../ruby-1.9.3/insns.def:1015
#10 0x000000000051ed7e in vm_exec (th=0x197ffe90) at ../ruby-1.9.3/vm.c:1220
#11 0x000000000051fad5 in invoke_block_from_c (th=0x197ffe90,
block=, self=, argc=0,
argv=, blockptr=, cref=0x0)
at ../ruby-1.9.3/vm.c:624
#12 0x000000000052026f in rb_vm_invoke_proc (th=0x197ffe90, proc=0x196d72a0,
self=425420560, argc=0, argv=0x197d56c8, blockptr=0x0)
at ../ruby-1.9.3/vm.c:670
#13 0x000000000052f5c1 in thread_start_func_2 (th=0x197ffe90,
stack_start=) at ../ruby-1.9.3/thread.c:453
#14 0x000000000052f75e in thread_start_func_1 (th_ptr=0x197ffe90)
at ../ruby-1.9.3/thread_pthread.c:656
#15 0x0000003a3500673d in start_thread () from /lib64/libpthread.so.0
#16 0x0000003a344d44bd in clone () from /lib64/libc.so.6