summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2020-09-24 17:06:33 +0900
committerKoichi Sasada <ko1@atdot.net>2020-09-24 17:09:12 +0900
commit4a588e70b88028b3121babc43a26de0d13bdbb03 (patch)
treea8d6c196c1d4addf3a0f4303d820dd8fbbf2634d /gc.c
parente06f4a3b1fbf703bc6ccb113bfe6bdc75ec9be38 (diff)
sync rb_gc_register_mark_object()
rb_vm_t::mark_object_ary is global resource so we need to synchronize to access it.
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/gc.c b/gc.c
index d9c873166f..fcb9c6454e 100644
--- a/gc.c
+++ b/gc.c
@@ -7347,15 +7347,19 @@ rb_gc_force_recycle(VALUE obj)
void
rb_gc_register_mark_object(VALUE obj)
{
- VALUE ary_ary = GET_VM()->mark_object_ary;
- VALUE ary = rb_ary_last(0, 0, ary_ary);
+ RB_VM_LOCK_ENTER();
+ {
+ VALUE ary_ary = GET_VM()->mark_object_ary;
+ VALUE ary = rb_ary_last(0, 0, ary_ary);
- if (ary == Qnil || RARRAY_LEN(ary) >= MARK_OBJECT_ARY_BUCKET_SIZE) {
- ary = rb_ary_tmp_new(MARK_OBJECT_ARY_BUCKET_SIZE);
- rb_ary_push(ary_ary, ary);
- }
+ if (ary == Qnil || RARRAY_LEN(ary) >= MARK_OBJECT_ARY_BUCKET_SIZE) {
+ ary = rb_ary_tmp_new(MARK_OBJECT_ARY_BUCKET_SIZE);
+ rb_ary_push(ary_ary, ary);
+ }
- rb_ary_push(ary, obj);
+ rb_ary_push(ary, obj);
+ }
+ RB_VM_LOCK_LEAVE();
}
void