diff options
Diffstat (limited to 'ractor_sync.c')
| -rw-r--r-- | ractor_sync.c | 66 |
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 = { |
