[ruby-cvs:60536] normal:r53373 (trunk): thread_pthread.c (rb_thread_create_timer_thread): fix race

normal at ruby-lang.org normal at ruby-lang.org
Wed Dec 30 03:20:28 JST 2015


normal	2015-12-30 03:20:27 +0900 (Wed, 30 Dec 2015)

  New Revision: 53373

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=53373

  Log:
    thread_pthread.c (rb_thread_create_timer_thread): fix race
    
    This fixes an occasional [ASYNC BUG] failure in
    bootstraptest/test_fork.rb '[ruby-dev:37934]'
    which tests fork/pthread_create failure by setting
    RLIMIT_NPROC to 1 and triggering EAGAIN on pthread_create
    when attempting to recreate the timer thread.
    
    The problem timeline is as follows:
    
    thread 1                           thread 2
    ---------------------------------------------------------------
    rb_thread_create_timer_thread
    setup_communication_pipe
                                       rb_thread_wakeup_timer_thread_low
    pthread_create fails               pipe looks valid, write!
    CLOSE_INVALIDATE (x4)              EBADF -> ASYNC BUG
    
    The checks in rb_thread_wakeup_timer_thread_low only tried to
    guarantee proper ordering with native_stop_timer_thread, not
    rb_thread_create_timer_thread :x
    
    Now, this should allow rb_thread_create_timer_thread to
    synchronize properly with rb_thread_wakeup_timer_thread_low by
    delaying the validation marking of the timer_thread_pipe until
    we are certain the timer thread is alive.
    
    In this version, rb_thread_wakeup_timer_thread_low becomes a
    noop.  Threading is still completely broken with NPROC==1, but
    there's not much we can do about it beside warn the user.
    We no longer spew a scary [ASYNC BUG] message or dump core
    on them.
    
    * thread_pthread.c (setup_communication_pipe): delay setting owner
      (rb_thread_create_timer_thread): until thread creation succeeds
      [ruby-core:72590] [Bug #11922]

  Modified files:
    trunk/ChangeLog
    trunk/thread_pthread.c


More information about the ruby-cvs mailing list