Commit da66e720 authored by erikcorry's avatar erikcorry Committed by Commit bot

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}
parent 1d2be2af
...@@ -538,10 +538,13 @@ Isolate* Heap::isolate() { ...@@ -538,10 +538,13 @@ Isolate* Heap::isolate() {
AllocationResult __allocation__ = FUNCTION_CALL; \ AllocationResult __allocation__ = FUNCTION_CALL; \
Object* __object__ = NULL; \ Object* __object__ = NULL; \
RETURN_OBJECT_UNLESS_RETRY(ISOLATE, RETURN_VALUE) \ RETURN_OBJECT_UNLESS_RETRY(ISOLATE, RETURN_VALUE) \
(ISOLATE)->heap()->CollectGarbage(__allocation__.RetrySpace(), \ /* Two GCs before panicking. In newspace will almost always succeed. */ \
"allocation failure"); \ for (int __i__ = 0; __i__ < 2; __i__++) { \
__allocation__ = FUNCTION_CALL; \ (ISOLATE)->heap()->CollectGarbage(__allocation__.RetrySpace(), \
RETURN_OBJECT_UNLESS_RETRY(ISOLATE, RETURN_VALUE) \ "allocation failure"); \
__allocation__ = FUNCTION_CALL; \
RETURN_OBJECT_UNLESS_RETRY(ISOLATE, RETURN_VALUE) \
} \
(ISOLATE)->counters()->gc_last_resort_from_handles()->Increment(); \ (ISOLATE)->counters()->gc_last_resort_from_handles()->Increment(); \
(ISOLATE)->heap()->CollectAllAvailableGarbage("last resort gc"); \ (ISOLATE)->heap()->CollectAllAvailableGarbage("last resort gc"); \
{ \ { \
......
...@@ -38,9 +38,16 @@ using namespace v8::internal; ...@@ -38,9 +38,16 @@ using namespace v8::internal;
static AllocationResult AllocateAfterFailures() { static AllocationResult AllocateAfterFailures() {
static int attempts = 0; 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(); 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. // New space.
SimulateFullSpace(heap->new_space()); SimulateFullSpace(heap->new_space());
heap->AllocateByteArray(100).ToObjectChecked(); heap->AllocateByteArray(100).ToObjectChecked();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment