Make assertions allow incremental GC when disabled

When assertions are enabled, the following code triggers an assertion
error:

    GC.disable
    GC.start(immediate_mark: false, immediate_sweep: false)

    10_000_000.times { Object.new }

This is because the GC.start ignores that the GC is disabled and will
start incremental marking and lazy sweeping. But the assertions in
gc_marks_continue and gc_sweep_continue assert that GC is not disabled.

This commit changes it for the assertion to pass if the GC was triggered
from a method.
This commit is contained in:
Peter Zhu 2024-08-16 16:02:16 -04:00
parent 786d000652
commit cb28487722
Notes: git 2024-08-19 14:59:02 +00:00
2 changed files with 12 additions and 2 deletions

View File

@ -4182,7 +4182,7 @@ gc_sweep_rest(rb_objspace_t *objspace)
static void static void
gc_sweep_continue(rb_objspace_t *objspace, rb_size_pool_t *sweep_size_pool, rb_heap_t *heap) gc_sweep_continue(rb_objspace_t *objspace, rb_size_pool_t *sweep_size_pool, rb_heap_t *heap)
{ {
GC_ASSERT(dont_gc_val() == FALSE); GC_ASSERT(dont_gc_val() == FALSE || objspace->profile.latest_gc_info & GPR_FLAG_METHOD);
if (!GC_ENABLE_LAZY_SWEEP) return; if (!GC_ENABLE_LAZY_SWEEP) return;
gc_sweeping_enter(objspace); gc_sweeping_enter(objspace);
@ -5985,7 +5985,7 @@ gc_marks_step(rb_objspace_t *objspace, size_t slots)
static bool static bool
gc_marks_continue(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap) gc_marks_continue(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap)
{ {
GC_ASSERT(dont_gc_val() == FALSE); GC_ASSERT(dont_gc_val() == FALSE || objspace->profile.latest_gc_info & GPR_FLAG_METHOD);
bool marking_finished = true; bool marking_finished = true;
gc_marking_enter(objspace); gc_marking_enter(objspace);

View File

@ -856,6 +856,16 @@ class TestGc < Test::Unit::TestCase
ensure ensure
GC.enable unless disabled GC.enable unless disabled
end end
begin
disabled = GC.disable
c = GC.count
GC.start(immediate_mark: false, immediate_sweep: false)
10_000.times { Object.new }
assert_equal 1, GC.count - c
ensure
GC.enable unless disabled
end
end end
def test_vm_object def test_vm_object