1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

merge revision(s) 5c7af72304d0ad33cd3f21b24a4bc44e8acd5b2c,d650b17686d49c2ce8e6a87039861154e93d4621: [Backport #18497]

Assuming EXIT_SUCCESS equals 0 is not portable

    ---
     test/ruby/test_fiber.rb | 6 +++---
     1 file changed, 3 insertions(+), 3 deletions(-)

    `rb_fiber_terminate` must not return [Bug #18497]

    In a forked process from a fiber, the fiber becomes the only
    fiber, `fiber_switch` does nothing as there is no other fibers,
    `rb_fiber_terminate` does not terminate the fiber.  In that case,
    reaches the end of `fiber_entry` finaly, which is declared as
    "COROUTINE" and should never return.
    ---
     cont.c                     |  3 ++-
     eval_intern.h              |  2 +-
     test/fiber/test_process.rb | 15 +++++++++++++++
     test/ruby/test_fiber.rb    |  5 +++++
     4 files changed, 23 insertions(+), 2 deletions(-)

    note that only backported a part of above patch because of incompatibility
    of ruby_2_7.
This commit is contained in:
NAKAMURA Usaku 2022-03-19 22:23:08 +09:00
parent ea9b0fe5d3
commit 81f5453bd8
3 changed files with 6 additions and 5 deletions

3
cont.c
View file

@ -1796,7 +1796,7 @@ rb_fiber_new(rb_block_call_func_t func, VALUE obj)
return fiber_initialize(fiber_alloc(rb_cFiber), rb_proc_new(func, obj), &shared_fiber_pool);
}
static void rb_fiber_terminate(rb_fiber_t *fiber, int need_interrupt);
NORETURN(static void rb_fiber_terminate(rb_fiber_t *fiber, int need_interrupt));
#define PASS_KW_SPLAT (rb_empty_keyword_given_p() ? RB_PASS_EMPTY_KEYWORDS : rb_keyword_given_p())
@ -2090,6 +2090,7 @@ rb_fiber_terminate(rb_fiber_t *fiber, int need_interrupt)
next_fiber = return_fiber();
if (need_interrupt) RUBY_VM_SET_INTERRUPT(&next_fiber->cont.saved_ec);
fiber_switch(next_fiber, 1, &value, 0, RB_NO_KEYWORDS);
ruby_stop(0);
}
VALUE

View file

@ -318,7 +318,7 @@ class TestFiber < Test::Unit::TestCase
Fiber.new {}.transfer
Fiber.new { Fiber.yield }
end
exit!(0)
exit!(true)
end
}.transfer
_, status = Process.waitpid2(xpid)
@ -327,8 +327,8 @@ class TestFiber < Test::Unit::TestCase
end.resume
end
pid, status = Process.waitpid2(pid)
assert_equal(0, status.exitstatus, bug5700)
assert_equal(false, status.signaled?, bug5700)
assert_not_predicate(status, :signaled?, bug5700)
assert_predicate(status, :success?, bug5700)
end
def test_exit_in_fiber

View file

@ -2,7 +2,7 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 6
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
#define RUBY_PATCHLEVEL 212
#define RUBY_PATCHLEVEL 213
#define RUBY_RELEASE_YEAR 2022
#define RUBY_RELEASE_MONTH 3