Thanks Eric and Chikanaga-san.

Could you commit it?  Maybe 1.9.3 also needs this patch.  But I'm not
sure how to commit frozen 1.9.3 branch.

Regards,
Koichi

(2011/09/20 17:25), Tomoyuki Chikanaga wrote:
> 
> Issue #5343 has been updated by Tomoyuki Chikanaga.
> 
> 
> Hi, sasada san.
> With your patch, over 60000 times trials pass successfully.
> Your patch works fine for me too.
> Thank you.
> ----------------------------------------
> Bug #5343: Unexpected blocking behavior when interrupt Socket#accept
> http://redmine.ruby-lang.org/issues/5343
> 
> Author: Tomoyuki Chikanaga
> Status: Assigned
> Priority: High
> Assignee: Koichi Sasada
> Category: ext
> Target version: 1.9.3
> ruby -v: -
> 
> 
> 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
> 
> 
> 


-- 
// SASADA Koichi at atdot dot net