From da66e720a32baa0686bab3eb6c44e5d4a1b9ebcc Mon Sep 17 00:00:00 2001 From: erikcorry Date: Mon, 27 Apr 2015 07:10:27 -0700 Subject: [PATCH] Do more to avoid last-resort stop-the-world GC BUG=chromium:481433 R=hpayer@chromium.org LOG=y Review URL: https://codereview.chromium.org/1104113002 Cr-Commit-Position: refs/heads/master@{#28082} --- src/heap/heap-inl.h | 11 +++++++---- test/cctest/test-alloc.cc | 9 ++++++++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/heap/heap-inl.h b/src/heap/heap-inl.h index 426e432..12c4606 100644 --- a/src/heap/heap-inl.h +++ b/src/heap/heap-inl.h @@ -538,10 +538,13 @@ Isolate* Heap::isolate() { AllocationResult __allocation__ = FUNCTION_CALL; \ Object* __object__ = NULL; \ RETURN_OBJECT_UNLESS_RETRY(ISOLATE, RETURN_VALUE) \ - (ISOLATE)->heap()->CollectGarbage(__allocation__.RetrySpace(), \ - "allocation failure"); \ - __allocation__ = FUNCTION_CALL; \ - RETURN_OBJECT_UNLESS_RETRY(ISOLATE, RETURN_VALUE) \ + /* Two GCs before panicking. In newspace will almost always succeed. */ \ + for (int __i__ = 0; __i__ < 2; __i__++) { \ + (ISOLATE)->heap()->CollectGarbage(__allocation__.RetrySpace(), \ + "allocation failure"); \ + __allocation__ = FUNCTION_CALL; \ + RETURN_OBJECT_UNLESS_RETRY(ISOLATE, RETURN_VALUE) \ + } \ (ISOLATE)->counters()->gc_last_resort_from_handles()->Increment(); \ (ISOLATE)->heap()->CollectAllAvailableGarbage("last resort gc"); \ { \ diff --git a/test/cctest/test-alloc.cc b/test/cctest/test-alloc.cc index 66f69f8..74388d1 100644 --- a/test/cctest/test-alloc.cc +++ b/test/cctest/test-alloc.cc @@ -38,9 +38,16 @@ using namespace v8::internal; static AllocationResult AllocateAfterFailures() { static int attempts = 0; - if (++attempts < 3) return AllocationResult::Retry(); + // The first 4 times we simulate a full heap, by returning retry. + if (++attempts < 4) return AllocationResult::Retry(); + + // Expose some private stuff on Heap. TestHeap* heap = CcTest::test_heap(); + // Now that we have returned 'retry' 4 times, we are in a last-chance + // scenario, with always_allocate. See CALL_AND_RETRY. Test that all + // allocations succeed. + // New space. SimulateFullSpace(heap->new_space()); heap->AllocateByteArray(100).ToObjectChecked(); -- 2.7.4