diff options
author | Koichi Sasada <ko1@atdot.net> | 2020-09-24 17:06:33 +0900 |
---|---|---|
committer | Koichi Sasada <ko1@atdot.net> | 2020-09-24 17:09:12 +0900 |
commit | 4a588e70b88028b3121babc43a26de0d13bdbb03 (patch) | |
tree | a8d6c196c1d4addf3a0f4303d820dd8fbbf2634d /gc.c | |
parent | e06f4a3b1fbf703bc6ccb113bfe6bdc75ec9be38 (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.c | 18 |
1 files changed, 11 insertions, 7 deletions
@@ -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 |