summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorKJ Tsanaktsidis <ktsanaktsidis@zendesk.com>2023-11-07 22:06:33 +1100
committerJean Boussier <jean.boussier@gmail.com>2023-11-12 17:50:37 +0100
commit76dc327eeffefe02577999fe5f8215f762a581b6 (patch)
tree6209120d82c94f04993d3059bc0e402d02d9cbac /gc.c
parent60e19a0b5fc9c067ee88751192dc56da618f5060 (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.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/gc.c b/gc.c
index 7710fec7d4..510b83c817 100644
--- a/gc.c
+++ b/gc.c
@@ -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();
}
/*