From deed21bb08170431891b65fda26f4a3557c9ffd4 Mon Sep 17 00:00:00 2001 From: Koichi Sasada Date: Wed, 11 Nov 2020 01:55:28 +0900 Subject: [PATCH] ignore yield_atexit if outgoing port is closed If outgoing_port is closed, Ractor.yield never successes. [Bug #17310] --- bootstraptest/test_ractor.rb | 10 ++++++++++ ractor.c | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/bootstraptest/test_ractor.rb b/bootstraptest/test_ractor.rb index 86a033cba8..0720c01caa 100644 --- a/bootstraptest/test_ractor.rb +++ b/bootstraptest/test_ractor.rb @@ -309,6 +309,16 @@ assert_equal 'ok', %q{ end } +# a ractor with closed outgoing port should terminate +assert_equal 'ok', %q{ + Ractor.new do + close_outgoing + end + + true until Ractor.count == 1 + :ok +} + # multiple Ractors can receive (wait) from one Ractor assert_equal '[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]', %q{ pipe = Ractor.new do diff --git a/ractor.c b/ractor.c index 350e9c7b3f..1e32c1b95e 100644 --- a/ractor.c +++ b/ractor.c @@ -1288,6 +1288,10 @@ ractor_create(rb_execution_context_t *ec, VALUE self, VALUE loc, VALUE name, VAL static void ractor_yield_atexit(rb_execution_context_t *ec, rb_ractor_t *cr, VALUE v, bool exc) { + if (cr->outgoing_port_closed) { + return; + } + ASSERT_ractor_unlocking(cr); struct rb_ractor_basket basket;