From 8c776261c2beb02ba44d2bd3b6eae9bdd2591909 Mon Sep 17 00:00:00 2001 From: "vegorov@chromium.org" Date: Fri, 20 Jan 2012 17:21:26 +0000 Subject: [PATCH] Limit number of loop iterations in Heap::ReserveSpace. This allows to avoid infinite loops in pathalogical cases e.g. when OS refuses to give new pages to V8. R=erik.corry@gmail.com BUG=99027 Review URL: https://chromiumcodereview.appspot.com/8286020 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10466 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/heap.cc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/heap.cc b/src/heap.cc index 3a8b609173..d97f337977 100644 --- a/src/heap.cc +++ b/src/heap.cc @@ -583,7 +583,9 @@ void Heap::ReserveSpace( PagedSpace* cell_space = Heap::cell_space(); LargeObjectSpace* lo_space = Heap::lo_space(); bool gc_performed = true; - while (gc_performed) { + int counter = 0; + static const int kThreshold = 20; + while (gc_performed && counter++ < kThreshold) { gc_performed = false; if (!new_space->ReserveSpace(new_space_size)) { Heap::CollectGarbage(NEW_SPACE); @@ -622,6 +624,11 @@ void Heap::ReserveSpace( gc_performed = true; } } + + if (gc_performed) { + // Failed to reserve the space after several attempts. + V8::FatalProcessOutOfMemory("Heap::ReserveSpace"); + } }