зеркало из https://github.com/github/ruby.git
Ractor.yield should raise if out-port is closed
Ractor.yield should raise Ractor::ClosedError if current Ractor's outgoing-port is closed.
This commit is contained in:
Родитель
5286526346
Коммит
d247dedade
|
@ -225,6 +225,27 @@ assert_equal 'ok', %q{
|
|||
end
|
||||
}
|
||||
|
||||
# Ractor.yield raises Ractor::ClosedError when outgoing port is closed.
|
||||
assert_equal 'ok', %q{
|
||||
r = Ractor.new Ractor.current do |main|
|
||||
Ractor.recv
|
||||
main << true
|
||||
Ractor.yield 1
|
||||
end
|
||||
|
||||
r.close_outgoing
|
||||
r << true
|
||||
Ractor.recv
|
||||
|
||||
begin
|
||||
r.take
|
||||
rescue Ractor::ClosedError
|
||||
'ok'
|
||||
else
|
||||
'ng'
|
||||
end
|
||||
}
|
||||
|
||||
# Raise Ractor::ClosedError when try to send into a ractor with closed incoming port
|
||||
assert_equal 'ok', %q{
|
||||
r = Ractor.new { Ractor.recv }
|
||||
|
|
8
ractor.c
8
ractor.c
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче