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]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53373 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
normal 2015-12-29 18:20:27 +00:00
Родитель 290deeb705
Коммит 24c979bdea
2 изменённых файлов: 9 добавлений и 2 удалений

Просмотреть файл

@ -1,3 +1,9 @@
Wed Dec 30 02:55:09 2015 Eric Wong <e@80x24.org>
* thread_pthread.c (setup_communication_pipe): delay setting owner
(rb_thread_create_timer_thread): until thread creation succeeds
[ruby-core:72590] [Bug #11922]
Tue Dec 29 19:12:46 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ruby.c (proc_options): -W command line option should be able to

Просмотреть файл

@ -1406,8 +1406,6 @@ setup_communication_pipe(void)
return e;
}
/* validate pipe on this process */
timer_thread_pipe.owner_process = getpid();
return 0;
}
@ -1615,6 +1613,9 @@ rb_thread_create_timer_thread(void)
#endif
return;
}
/* validate pipe on this process */
timer_thread_pipe.owner_process = getpid();
timer_thread.created = 1;
#ifdef HAVE_PTHREAD_ATTR_INIT
pthread_attr_destroy(&attr);