From 04bcf8456abb06163fdf7bb720240ac2a1797064 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Thu, 7 May 2026 20:02:55 -0400 Subject: [PATCH] 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 --- 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 e4cd719..cb0e518 100644 --- a/gc/mmtk/mmtk.c +++ b/gc/mmtk/mmtk.c @@ -39,6 +39,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]; @@ -338,9 +340,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); @@ -579,6 +581,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