3 ms·
MRI implements a write barrier. You can check out the write barrier implementation here: https://github.com/ruby/ruby/blob/7bd93293621b85a87e7e117317612bb0a8
by tenderlove 6y ago
MRI implements a write barrier. You can check out the write barrier implementation here:
https://github.com/ruby/ruby/blob/7bd93293621b85a87e7e117317612bb0a84efb7a/gc.c#L7802
The behavior for writes on a black object is defined in this function:
https://github.com/ruby/ruby/blob/7bd93293621b85a87e7e117317612bb0a84efb7a/gc.c#L7766
Basically when a black -> white reference is written during incremental marking, the white object will be grey'd and added to the mark stack.
Happy Thursday!
- ufo 6y agoAlternatively, you can also move the gc "backwards", changing the black object. In Lua, sometimes the write barrier recolors the white child object to grey and sometimes it recolors the black parent object to grey. IIRC, the motivation for going backwards is that if you assign a large number of white children, recoloring the parent once is faster than recoloring all the children.