зеркало из https://github.com/github/ruby.git
thread.c: stop if forked in a sub-thread
* thread.c (thread_start_func_2): stop if forked in a sub-thread, the thread has become the main thread. [ruby-core:62070] [Bug #9751] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45899 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
a46e21c86f
Коммит
9883632d6a
|
@ -1,3 +1,9 @@
|
|||
Sat May 10 13:32:18 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* thread.c (thread_start_func_2): stop if forked in a sub-thread,
|
||||
the thread has become the main thread.
|
||||
[ruby-core:62070] [Bug #9751]
|
||||
|
||||
Sat May 10 09:32:19 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
|
||||
|
||||
* man/ruby.1: remove deadlink. [ruby-core:62145][Bug #9773]
|
||||
|
|
|
@ -973,4 +973,25 @@ Thread.new(Thread.current) {|mth|
|
|||
pid, status = Process.waitpid2(pid)
|
||||
assert_equal(false, status.success?, bug8433)
|
||||
end if Process.respond_to?(:fork)
|
||||
|
||||
def test_fork_in_thread
|
||||
bug9751 = '[ruby-core:62070] [Bug #9751]'
|
||||
f = nil
|
||||
th = Thread.start do
|
||||
unless f = IO.popen("-")
|
||||
STDERR.reopen(STDOUT)
|
||||
exit
|
||||
end
|
||||
Process.wait2(f.pid)
|
||||
end
|
||||
unless th.join(3)
|
||||
Process.kill(:QUIT, f.pid)
|
||||
Process.kill(:KILL, f.pid) unless th.join(1)
|
||||
end
|
||||
_, status = th.value
|
||||
output = f.read
|
||||
f.close
|
||||
assert_not_predicate(status, :signaled?, FailDesc[status, bug9751, output])
|
||||
assert_predicate(status, :success?, bug9751)
|
||||
end if Process.respond_to?(:fork)
|
||||
end
|
||||
|
|
3
thread.c
3
thread.c
|
@ -569,6 +569,9 @@ thread_start_func_2(rb_thread_t *th, VALUE *stack_start, VALUE *register_stack_s
|
|||
thread_debug("thread end: %p\n", (void *)th);
|
||||
|
||||
main_th = th->vm->main_thread;
|
||||
if (main_th == th) {
|
||||
ruby_stop(0);
|
||||
}
|
||||
if (RB_TYPE_P(errinfo, T_OBJECT)) {
|
||||
/* treat with normal error object */
|
||||
rb_threadptr_raise(main_th, 1, &errinfo);
|
||||
|
|
Загрузка…
Ссылка в новой задаче