the test_merge_path_dot_dot_removal_is_linear test bases its time limit on the CPU time of the calling thread. But the limit is actually checked against wall clock time so GC pauses count against it - despite that work happening on othe...eightbitraptor (Matt V-H)
GC.start has to run even when GC is disabled, so we enable collection, run the GC and then disable it again. #134 fixed the crash we saw when another Ractor requested a GC before we could re-disable, but we still restore whatever state w...eightbitraptor (Matt V-H)
use retain_mut in process_obj_free_candidates instead of building a new Vec on every GC. This saves about 38MiB of peak RSS when running the Lobsters benchmark with 12 workers. https://github.com/ruby/mmtk/commit/1292d9a488eightbitraptor (Matt V-H)
add_obj_free_candidates_batch walked the whole batch once for every bucket and kept the objects where i % num_buckets == idx. Each flush of 128 candidates ran 128 * num_buckets modulo operations on the mutator thread. There is one bucket...eightbitraptor (Matt V-H)
object_id took the VM lock for every shareable object in multi-Ractor mode, even when the object already had an id. Kernel#hash reaches object_id through rb_obj_hash, so a shareable T_DATA such as an Encoding, a Ractor or a Ractor::Port...eightbitraptor (Matt V-H)
test_load_block_scalar_strip_indicator_in_linear_time asserts on wall clock time, and it fails intermittently when Ruby runs with MMTk. https://github.com/ruby/mmtk/commit/627a8eca44eightbitraptor (Matt V-H)
Marshal.load uses load_arg to store state but wasn't marking the src string or the proc. Usually not a problem because the caller would keep the string alive. But when a Ractor.make_shareable falls back to using Marshal then nothing keep...eightbitraptor (Matt V-H)
rb_gc_impl_writebarrier and rb_gc_impl_writebarrier_remember looked up the Ractor cache and called into Rust for every store, even for Immix, MarkSweep and NoGC, whose barrier is NoBarrier and does nothing. Lobsters runs about 920k barri...eightbitraptor (Matt V-H)
test_major_sweep_does_not_create_oldmalloc_debt assumed the ring was already old when the loop started. When Ruby is running with parse.y this isn't always the case. That only held when GCs ran while the ring was built. Under parse.y oft...eightbitraptor (Matt V-H)