Skip to content

Commit e639e5f

Browse files
peterzhu2118luke-gruberjhawthorn
committed
Make rb_gc_impl_writebarrier_remember Ractor-safe
rb_gc_impl_writebarrier_remember is not Ractor safe because it writes to bitmaps and also pushes onto the mark stack during incremental marking. We should acquire the VM lock to prevent race conditions. In the case that the object is not old, there is no performance impact. However, we can see a performance impact in this microbenchmark where the object is old: 4.times.map do Ractor.new do ary = [] 3.times { GC.start } 10_000_000.times do |i| ary.push(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17) ary.clear end end end.map(&:value) Before: Time (mean ± σ): 682.4 ms ± 5.1 ms [User: 2564.8 ms, System: 16.0 ms] After: Time (mean ± σ): 5.522 s ± 0.096 s [User: 8.237 s, System: 7.931 s] Co-Authored-By: Luke Gruber <[email protected]> Co-Authored-By: John Hawthorn <[email protected]>
1 parent 0ba488d commit e639e5f

File tree

1 file changed

+12
-8
lines changed

1 file changed

+12
-8
lines changed

gc/default/default.c

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6110,15 +6110,19 @@ rb_gc_impl_writebarrier_remember(void *objspace_ptr, VALUE obj)
61106110

61116111
gc_report(1, objspace, "rb_gc_writebarrier_remember: %s\n", rb_obj_info(obj));
61126112

6113-
if (is_incremental_marking(objspace)) {
6114-
if (RVALUE_BLACK_P(objspace, obj)) {
6115-
gc_grey(objspace, obj);
6116-
}
6117-
}
6118-
else {
6119-
if (RVALUE_OLD_P(objspace, obj)) {
6120-
rgengc_remember(objspace, obj);
6113+
if (is_incremental_marking(objspace) || RVALUE_OLD_P(objspace, obj)) {
6114+
int lev = RB_GC_VM_LOCK_NO_BARRIER();
6115+
{
6116+
if (is_incremental_marking(objspace)) {
6117+
if (RVALUE_BLACK_P(objspace, obj)) {
6118+
gc_grey(objspace, obj);
6119+
}
6120+
}
6121+
else if (RVALUE_OLD_P(objspace, obj)) {
6122+
rgengc_remember(objspace, obj);
6123+
}
61216124
}
6125+
RB_GC_VM_UNLOCK_NO_BARRIER(lev);
61226126
}
61236127
}
61246128

0 commit comments

Comments
 (0)