diff options
author | KJ Tsanaktsidis <ktsanaktsidis@zendesk.com> | 2023-11-07 22:06:33 +1100 |
---|---|---|
committer | Jean Boussier <jean.boussier@gmail.com> | 2023-11-12 17:50:37 +0100 |
commit | 76dc327eeffefe02577999fe5f8215f762a581b6 (patch) | |
tree | 6209120d82c94f04993d3059bc0e402d02d9cbac /gc.c | |
parent | 60e19a0b5fc9c067ee88751192dc56da618f5060 (diff) |
Wrap rb_objspace_reachable_objects_from_root with RB_VM_LOCK
rb_objspace_reachable_objects_from has it too, so I figure it's most
likely required for _from_root as well.
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 28 |
1 files changed, 16 insertions, 12 deletions
@@ -11987,19 +11987,23 @@ objspace_reachable_objects_from_root(rb_objspace_t *objspace, void (func)(const { if (during_gc) rb_bug("objspace_reachable_objects_from_root() is not supported while during_gc == true"); - rb_ractor_t *cr = GET_RACTOR(); - struct root_objects_data data = { - .func = func, - .data = passing_data, - }; - struct gc_mark_func_data_struct mfd = { - .mark_func = root_objects_from, - .data = &data, - }, *prev_mfd = cr->mfd; + RB_VM_LOCK_ENTER(); + { + rb_ractor_t *cr = GET_RACTOR(); + struct root_objects_data data = { + .func = func, + .data = passing_data, + }; + struct gc_mark_func_data_struct mfd = { + .mark_func = root_objects_from, + .data = &data, + }, *prev_mfd = cr->mfd; - cr->mfd = &mfd; - gc_mark_roots(objspace, &data.category); - cr->mfd = prev_mfd; + cr->mfd = &mfd; + gc_mark_roots(objspace, &data.category); + cr->mfd = prev_mfd; + } + RB_VM_LOCK_LEAVE(); } /* |