diff options
author | Koichi Sasada <ko1@atdot.net> | 2020-09-25 11:39:15 +0900 |
---|---|---|
committer | Koichi Sasada <ko1@atdot.net> | 2020-09-25 12:53:58 +0900 |
commit | d247dedade684d8ba04da4af891791e5ab5878ef (patch) | |
tree | 710e24f7f84d91d58d014cbba809d8d06f65b6eb /ractor.c | |
parent | 52865263467b48c0f5af6d9548972dd1f9e5bee1 (diff) |
Ractor.yield should raise if out-port is closed
Ractor.yield should raise Ractor::ClosedError if current Ractor's
outgoing-port is closed.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/3578
Diffstat (limited to 'ractor.c')
-rw-r--r-- | ractor.c | 8 |
1 files changed, 8 insertions, 0 deletions
@@ -832,6 +832,10 @@ ractor_try_yield(rb_execution_context_t *ec, rb_ractor_t *cr, struct rb_ractor_b ASSERT_ractor_unlocking(cr); VM_ASSERT(basket->type != basket_type_none); + if (cr->outgoing_port_closed) { + rb_raise(rb_eRactorClosedError, "The outgoing-port is already closed"); + } + rb_ractor_t *r; retry_shift: @@ -1017,6 +1021,10 @@ ractor_select(rb_execution_context_t *ec, const VALUE *rs, int alen, VALUE yield cr->wait.wakeup_status = wakeup_by_retry; goto skip_sleep; } + else if (cr->outgoing_port_closed) { + cr->wait.wakeup_status = wakeup_by_close; + goto skip_sleep; + } break; } } |