Skip to content

Commit 0d63b9b

Browse files
committed
check closing flag
`Ractor.receive` and `Ractor.yield` should stop when the incoming/outgoing port is closed.
1 parent 4886a54 commit 0d63b9b

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

ractor.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -753,7 +753,7 @@ ractor_wait_receive(rb_execution_context_t *ec, rb_ractor_t *cr, struct rb_racto
753753

754754
RACTOR_LOCK(cr);
755755
{
756-
while (ractor_queue_empty_p(cr, rq)) {
756+
while (ractor_queue_empty_p(cr, rq) && !cr->sync.incoming_port_closed) {
757757
ractor_sleep(ec, cr, wait_receiving);
758758
}
759759
}
@@ -1364,6 +1364,9 @@ ractor_try_yield(rb_execution_context_t *ec, rb_ractor_t *cr, struct rb_ractor_q
13641364

13651365
return true;
13661366
}
1367+
else if (cr->sync.outgoing_port_closed) {
1368+
rb_raise(rb_eRactorClosedError, "The outgoing-port is already closed");
1369+
}
13671370
else {
13681371
RUBY_DEBUG_LOG("no take basket");
13691372
return false;
@@ -1375,7 +1378,7 @@ ractor_wait_yield(rb_execution_context_t *ec, rb_ractor_t *cr, struct rb_ractor_
13751378
{
13761379
RACTOR_LOCK_SELF(cr);
13771380
{
1378-
while (!ractor_check_take_basket(cr, ts)) {
1381+
while (!ractor_check_take_basket(cr, ts) && !cr->sync.outgoing_port_closed) {
13791382
ractor_sleep(ec, cr, wait_yielding);
13801383
}
13811384
}

0 commit comments

Comments
 (0)