From 56cd26f8353713c485f49fa68d804e0f04777e08 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Thu, 7 May 2026 20:02:55 -0400 Subject: [PATCH] [ruby/mmtk] Introduce event_hook_mutex for RUBY_INTERNAL_EVENT_FREEOBJ We can stop using rb_gc_worker_thread_set_vm_context because rb_gc_event_hook now uses rb_gc_get_ec since https://github.com/ruby/ruby/pull/16880 https://github.com/ruby/mmtk/commit/04bcf8456a --- gc/mmtk/mmtk.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/gc/mmtk/mmtk.c b/gc/mmtk/mmtk.c index 9b1aed4e5bd1f9..6547a6cdea4986 100644 --- a/gc/mmtk/mmtk.c +++ b/gc/mmtk/mmtk.c @@ -55,6 +55,8 @@ struct objspace { pthread_cond_t cond_world_started; size_t start_the_world_count; + pthread_mutex_t event_hook_mutex; + struct { bool gc_thread_crashed; char crash_msg[256]; @@ -354,9 +356,9 @@ rb_mmtk_call_obj_free(MMTk_ObjectReference object) struct objspace *objspace = rb_gc_get_objspace(); if (RB_UNLIKELY(rb_gc_event_hook_required_p(RUBY_INTERNAL_EVENT_FREEOBJ))) { - rb_gc_worker_thread_set_vm_context(&objspace->vm_context); + pthread_mutex_lock(&objspace->event_hook_mutex); rb_gc_event_hook(obj, RUBY_INTERNAL_EVENT_FREEOBJ); - rb_gc_worker_thread_unset_vm_context(&objspace->vm_context); + pthread_mutex_unlock(&objspace->event_hook_mutex); } rb_gc_obj_free(objspace, obj); @@ -599,6 +601,8 @@ rb_gc_impl_objspace_init(void *objspace_ptr) objspace->mutex = (pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER; objspace->cond_world_stopped = (pthread_cond_t)PTHREAD_COND_INITIALIZER; objspace->cond_world_started = (pthread_cond_t)PTHREAD_COND_INITIALIZER; + + objspace->event_hook_mutex = (pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER; } void