summaryrefslogtreecommitdiff
path: root/ractor_sync.c
diff options
context:
space:
mode:
Diffstat (limited to 'ractor_sync.c')
-rw-r--r--ractor_sync.c66
1 files changed, 24 insertions, 42 deletions
diff --git a/ractor_sync.c b/ractor_sync.c
index 52ce953851..44c84ded92 100644
--- a/ractor_sync.c
+++ b/ractor_sync.c
@@ -1,4 +1,3 @@
-
// this file is included by ractor.c
struct ractor_port {
@@ -29,27 +28,15 @@ ractor_port_mark(void *ptr)
}
}
-static void
-ractor_port_free(void *ptr)
-{
- xfree(ptr);
-}
-
-static size_t
-ractor_port_memsize(const void *ptr)
-{
- return sizeof(struct ractor_port);
-}
-
static const rb_data_type_t ractor_port_data_type = {
"ractor/port",
{
ractor_port_mark,
- ractor_port_free,
- ractor_port_memsize,
+ RUBY_TYPED_DEFAULT_FREE,
+ NULL, // memsize
NULL, // update
},
- 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
+ 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FROZEN_SHAREABLE | RUBY_TYPED_EMBEDDABLE,
};
static st_data_t
@@ -63,8 +50,7 @@ static struct ractor_port *
RACTOR_PORT_PTR(VALUE self)
{
VM_ASSERT(rb_typeddata_is_kind_of(self, &ractor_port_data_type));
- struct ractor_port *rp = DATA_PTR(self);
- return rp;
+ return RTYPEDDATA_GET_DATA(self);
}
static VALUE
@@ -72,6 +58,7 @@ ractor_port_alloc(VALUE klass)
{
struct ractor_port *rp;
VALUE rpv = TypedData_Make_Struct(klass, struct ractor_port, &ractor_port_data_type, rp);
+ rb_obj_freeze(rpv);
return rpv;
}
@@ -230,7 +217,7 @@ ractor_basket_mark(const struct ractor_basket *b)
static void
ractor_basket_free(struct ractor_basket *b)
{
- xfree(b);
+ SIZED_FREE(b);
}
static struct ractor_basket *
@@ -284,7 +271,7 @@ ractor_queue_free(struct ractor_queue *rq)
VM_ASSERT(ccan_list_empty(&rq->set));
- xfree(rq);
+ SIZED_FREE(rq);
}
RBIMPL_ATTR_MAYBE_UNUSED()
@@ -395,7 +382,6 @@ ractor_add_port(rb_ractor_t *r, st_data_t id)
RACTOR_LOCK(r);
{
- // memo: can cause GC, but GC doesn't use ractor locking.
st_insert(r->sync.ports, id, (st_data_t)rq);
}
RACTOR_UNLOCK(r);
@@ -575,7 +561,7 @@ ractor_monitor(rb_execution_context_t *ec, VALUE self, VALUE port)
RACTOR_UNLOCK(r);
if (terminated) {
- xfree(rm);
+ SIZED_FREE(rm);
ractor_port_send(ec, port, ractor_exit_token(r->sync.legacy_exc), Qfalse);
return Qfalse;
@@ -603,7 +589,7 @@ ractor_unmonitor(rb_execution_context_t *ec, VALUE self, VALUE port)
(unsigned int)ractor_port_id(&rm->port),
(unsigned int)rb_ractor_id(rm->port.r));
ccan_list_del(&rm->node);
- xfree(rm);
+ SIZED_FREE(rm);
}
}
}
@@ -641,7 +627,7 @@ ractor_notify_exit(rb_execution_context_t *ec, rb_ractor_t *cr, VALUE legacy, bo
ractor_try_send(ec, &rm->port, token, false);
ccan_list_del(&rm->node);
- xfree(rm);
+ SIZED_FREE(rm);
}
VM_ASSERT(ccan_list_empty(&cr->sync.monitors));
@@ -699,7 +685,12 @@ ractor_sync_free(rb_ractor_t *r)
static size_t
ractor_sync_memsize(const rb_ractor_t *r)
{
- return st_table_size(r->sync.ports);
+ if (r->sync.ports) {
+ return st_table_size(r->sync.ports);
+ }
+ else {
+ return 0;
+ }
}
static void
@@ -844,20 +835,6 @@ ractor_basket_accept(struct ractor_basket *b)
// Ractor blocking by receive
-enum ractor_wakeup_status {
- wakeup_none,
- wakeup_by_send,
- wakeup_by_interrupt,
-
- // wakeup_by_close,
-};
-
-struct ractor_waiter {
- enum ractor_wakeup_status wakeup_status;
- rb_thread_t *th;
- struct ccan_list_node node;
-};
-
#if VM_CHECK_MODE > 0
static bool
ractor_waiter_included(rb_ractor_t *cr, rb_thread_t *th)
@@ -1000,6 +977,7 @@ ubf_ractor_wait(void *ptr)
rb_thread_t *th = waiter->th;
rb_ractor_t *r = th->ractor;
+ rb_atomic_t event_serial = waiter->event_serial;
// clear ubf and nobody can kick UBF
th->unblock.func = NULL;
@@ -1009,7 +987,7 @@ ubf_ractor_wait(void *ptr)
{
RACTOR_LOCK(r);
{
- if (waiter->wakeup_status == wakeup_none) {
+ if (RUBY_ATOMIC_LOAD(th->unblock.event_serial) == event_serial && waiter->wakeup_status == wakeup_none) {
RUBY_DEBUG_LOG("waiter:%p", (void *)waiter);
waiter->wakeup_status = wakeup_by_interrupt;
@@ -1255,14 +1233,18 @@ ractor_selector_free(void *ptr)
{
struct ractor_selector *s = ptr;
st_free_table(s->ports);
- ruby_xfree(ptr);
+ SIZED_FREE(s);
}
static size_t
ractor_selector_memsize(const void *ptr)
{
const struct ractor_selector *s = ptr;
- return sizeof(struct ractor_selector) + st_memsize(s->ports);
+ size_t size = sizeof(struct ractor_selector);
+ if (s->ports) {
+ size += st_memsize(s->ports);
+ }
+ return size;
}
static const rb_data_type_t ractor_selector_data_type = {