diff options
| author | Peter Zhu <peter@peterzhu.ca> | 2026-05-07 20:02:55 -0400 |
|---|---|---|
| committer | git <svn-admin@ruby-lang.org> | 2026-05-09 13:08:44 +0000 |
| commit | 56cd26f8353713c485f49fa68d804e0f04777e08 (patch) | |
| tree | fc51575eab4c2958bb1c04e85be8b4fb9708d757 | |
| parent | 5faeea873ba4249c685c7f390e939560d736fea8 (diff) | |
[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
| -rw-r--r-- | gc/mmtk/mmtk.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/gc/mmtk/mmtk.c b/gc/mmtk/mmtk.c index 9b1aed4e5b..6547a6cdea 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 |
