Issue #5343 has been updated by Tomoyuki Chikanaga.


Hi,

I've found that this issue is not specific problem of TCPServer#accept.

The following script also rarely blocks forever.

require "thread"

queue = Queue.new
r, w = IO.pipe
th = Thread.start {
  queue.push(nil)
  r.read 1
}
queue.pop
th.kill.join

I guess this is because SIGVTALRM from send from ubf_select() is received by blocking thread after GVL release but before enter poll(2)/ppoll(2).
----------------------------------------
Bug #5343: Unexpected blocking behavior when interrupt Socket#accept
http://redmine.ruby-lang.org/issues/5343

Author: Tomoyuki Chikanaga
Status: Open
Priority: Normal
Assignee: 
Category: ext
Target version: 1.9.3
ruby -v: ruby 1.9.3dev (2011-09-17 revision 33290) [i686-linux]


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=<value optimized out>,
    argv=<value optimized out>, self=<value optimized out>)
    at ../ruby-1.9.3/thread.c:721
#7  thread_join_m (argc=<value optimized out>, argv=<value optimized out>,
    self=<value optimized out>) at ../ruby-1.9.3/thread.c:802
#8  0x0000000000524b0d in vm_call_cfunc (th=0x19551550, cfp=0x2b38cc37df08,
    num=<value optimized out>, blockptr=<value optimized out>,
    flag=<value optimized out>, id=<value optimized out>, me=0x196663c0,
    recv=427644560) at ../ruby-1.9.3/vm_insnhelper.c:404
#9  vm_call_method (th=0x19551550, cfp=0x2b38cc37df08,
    num=<value optimized out>, blockptr=<value optimized out>,
    flag=<value optimized out>, id=<value optimized out>, me=0x196663c0,
    recv=427644560) at ../ruby-1.9.3/vm_insnhelper.c:530
#10 0x000000000051908d in vm_exec_core (th=0x19551550,
    initial=<value optimized out>) 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=<value optimized out>)
    at ../ruby-1.9.3/eval.c:251
#15 ruby_run_node (n=<value optimized out>) 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=<value optimized out>,
    events=<value optimized out>, tv=0x0) at ../ruby-1.9.3/thread.c:2820
#2  rb_wait_for_single_fd (fd=<value optimized out>,
    events=<value optimized out>, 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=<value optimized out>, len=0x40473a3c)
    at ../../../ruby-1.9.3/ext/socket/init.c:499
#6  0x00002aaaab0c3310 in tcp_accept (sock=<value optimized out>)
    at ../../../ruby-1.9.3/ext/socket/tcpserver.c:55
#7  0x0000000000524b0d in vm_call_cfunc (th=0x197ffe90, cfp=0x2aaaab3d3f08,
    num=<value optimized out>, blockptr=<value optimized out>,
    flag=<value optimized out>, id=<value optimized out>, me=0x1980ba70,
    recv=427644480) at ../ruby-1.9.3/vm_insnhelper.c:404
#8  vm_call_method (th=0x197ffe90, cfp=0x2aaaab3d3f08,
    num=<value optimized out>, blockptr=<value optimized out>,
    flag=<value optimized out>, id=<value optimized out>, me=0x1980ba70,
    recv=427644480) at ../ruby-1.9.3/vm_insnhelper.c:530
#9  0x000000000051908d in vm_exec_core (th=0x197ffe90,
    initial=<value optimized out>) 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=<value optimized out>, self=<value optimized out>, argc=0,
    argv=<value optimized out>, blockptr=<value optimized out>, 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=<value optimized out>) 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



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