summaryrefslogtreecommitdiff
path: root/ractor.c
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2023-03-02 18:27:44 +0900
committerKoichi Sasada <ko1@atdot.net>2023-03-03 00:08:02 +0900
commit5875fce6ce678c444456cc7eed6f28ef000dac24 (patch)
treed18dce5e9da1c5991b154774a579cd0918a7cef5 /ractor.c
parent5f3c7ac19674b822c72e09e40cfb58fc71ac501e (diff)
`Ractor::Selector#empty?`
It returns the waiting set is empty or not. Also add Ractor::Selector's tests.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/7417
Diffstat (limited to 'ractor.c')
-rw-r--r--ractor.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/ractor.c b/ractor.c
index 1c5abbc422..b586432fb6 100644
--- a/ractor.c
+++ b/ractor.c
@@ -979,7 +979,7 @@ ractor_take_will_lock(rb_ractor_t *r, struct rb_ractor_basket *b)
RACTOR_LOCK(r);
{
- taken =ractor_take_will(r, b);
+ taken = ractor_take_will(r, b);
}
RACTOR_UNLOCK(r);
@@ -1009,6 +1009,8 @@ ractor_register_take(rb_ractor_t *cr, rb_ractor_t *r, struct rb_ractor_basket *t
}
else if (!is_take && ractor_take_has_will(r)) {
RUBY_DEBUG_LOG("has_will");
+ VM_ASSERT(config != NULL);
+ config->closed = true;
}
else if (r->sync.outgoing_port_closed) {
closed = true;
@@ -1515,6 +1517,13 @@ ractor_selector_clear(rb_execution_context_t *ec, VALUE selv)
return selv;
}
+static VALUE
+ractor_selector_empty_p(rb_execution_context_t *ec, VALUE selv)
+{
+ struct rb_ractor_selector *s = RACTOR_SELECTOR_PTR(selv);
+ return s->take_ractors->num_entries == 0 ? Qtrue : Qfalse;
+}
+
static int
ractor_selector_wait_i(st_data_t key, st_data_t val, st_data_t dat)
{
@@ -1687,6 +1696,10 @@ ractor_selector_wait(rb_execution_context_t *ec, VALUE selv, VALUE do_receivev,
}
break;
}
+ case basket_type_will:
+ // no more messages
+ ractor_selector_remove(ec, selv, taken_basket.sender);
+ break;
default:
break;
}