From 4a588e70b88028b3121babc43a26de0d13bdbb03 Mon Sep 17 00:00:00 2001 From: Koichi Sasada Date: Thu, 24 Sep 2020 17:06:33 +0900 Subject: sync rb_gc_register_mark_object() rb_vm_t::mark_object_ary is global resource so we need to synchronize to access it. --- gc.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'gc.c') 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 -- cgit v1.2.3