Author: [EMAIL PROTECTED]
Date: Wed Oct 29 05:16:34 2008
New Revision: 638

Modified:
    branches/bleeding_edge/src/codegen-arm.cc
    branches/bleeding_edge/src/codegen-ia32.cc
    branches/bleeding_edge/src/handles.cc
    branches/bleeding_edge/src/runtime.cc

Log:
Allow three runtime call attempts before throwing an out of
memory exception. Still needs work in Runtime_PerformGC to
make sure we'll allow future allocations.
Review URL: http://codereview.chromium.org/8873

Modified: branches/bleeding_edge/src/codegen-arm.cc
==============================================================================
--- branches/bleeding_edge/src/codegen-arm.cc   (original)
+++ branches/bleeding_edge/src/codegen-arm.cc   Wed Oct 29 05:16:34 2008
@@ -3920,23 +3920,27 @@
    Label throw_out_of_memory_exception;
    Label throw_normal_exception;

-#ifdef DEBUG
+  // Call into the runtime system. Collect garbage before the call if
+  // running with --gc-greedy set.
    if (FLAG_gc_greedy) {
      Failure* failure = Failure::RetryAfterGC(0);
      __ mov(r0, Operand(reinterpret_cast<intptr_t>(failure)));
    }
-  GenerateCore(masm,
-               &throw_normal_exception,
+  GenerateCore(masm, &throw_normal_exception,
                 &throw_out_of_memory_exception,
                 frame_type,
                 FLAG_gc_greedy);
-#else
+
+  // Do space-specific GC and retry runtime call.
    GenerateCore(masm,
                 &throw_normal_exception,
                 &throw_out_of_memory_exception,
                 frame_type,
-               false);
-#endif
+               true);
+
+  // Do full GC and retry runtime call one final time.
+  Failure* failure = Failure::InternalError();
+  __ mov(r0, Operand(reinterpret_cast<int32_t>(failure)));
    GenerateCore(masm,
                 &throw_normal_exception,
                 &throw_out_of_memory_exception,

Modified: branches/bleeding_edge/src/codegen-ia32.cc
==============================================================================
--- branches/bleeding_edge/src/codegen-ia32.cc  (original)
+++ branches/bleeding_edge/src/codegen-ia32.cc  Wed Oct 29 05:16:34 2008
@@ -4955,7 +4955,8 @@
    Label throw_out_of_memory_exception;
    Label throw_normal_exception;

-#ifdef DEBUG
+  // Call into the runtime system. Collect garbage before the call if
+  // running with --gc-greedy set.
    if (FLAG_gc_greedy) {
      Failure* failure = Failure::RetryAfterGC(0);
      __ mov(Operand(eax), Immediate(reinterpret_cast<int32_t>(failure)));
@@ -4964,14 +4965,17 @@
                 &throw_out_of_memory_exception,
                 frame_type,
                 FLAG_gc_greedy);
-#else
+
+  // Do space-specific GC and retry runtime call.
    GenerateCore(masm,
                 &throw_normal_exception,
                 &throw_out_of_memory_exception,
                 frame_type,
-               false);
-#endif
+               true);

+  // Do full GC and retry runtime call one final time.
+  Failure* failure = Failure::InternalError();
+  __ mov(Operand(eax), Immediate(reinterpret_cast<int32_t>(failure)));
    GenerateCore(masm,
                 &throw_normal_exception,
                 &throw_out_of_memory_exception,

Modified: branches/bleeding_edge/src/handles.cc
==============================================================================
--- branches/bleeding_edge/src/handles.cc       (original)
+++ branches/bleeding_edge/src/handles.cc       Wed Oct 29 05:16:34 2008
@@ -39,16 +39,6 @@

  namespace v8 { namespace internal {

-#define CALL_GC(RESULT)                                             \
-  {                                                                 \
-    Failure* __failure__ = Failure::cast(RESULT);                   \
-    if (!Heap::CollectGarbage(__failure__->requested(),             \
-                              __failure__->allocation_space())) {   \
-       /* TODO(1181417): Fix this. */                               \
-       V8::FatalProcessOutOfMemory("Handles");                      \
-    }                                                               \
-  }
-

  Handle<FixedArray> AddKeysFromJSArray(Handle<FixedArray> content,
                                        Handle<JSArray> array) {
@@ -281,10 +271,6 @@
     
script->wrapper()->set_proxy(reinterpret_cast<Address>(handle.location()));
    return result;
  }
-
-
-#undef CALL_HEAP_FUNCTION
-#undef CALL_GC


  // Compute the property keys from the interceptor.

Modified: branches/bleeding_edge/src/runtime.cc
==============================================================================
--- branches/bleeding_edge/src/runtime.cc       (original)
+++ branches/bleeding_edge/src/runtime.cc       Wed Oct 29 05:16:34 2008
@@ -5780,9 +5780,15 @@

  void Runtime::PerformGC(Object* result) {
    Failure* failure = Failure::cast(result);
-  // Try to do a garbage collection; ignore it if it fails. The C
-  // entry stub will throw an out-of-memory exception in that case.
-  Heap::CollectGarbage(failure->requested(), failure->allocation_space());
+  if (failure->IsRetryAfterGC()) {
+    // Try to do a garbage collection; ignore it if it fails. The C
+    // entry stub will throw an out-of-memory exception in that case.
+    Heap::CollectGarbage(failure->requested(),  
failure->allocation_space());
+  } else {
+    // Handle last resort GC and make sure to allow future allocations
+    // to grow the heap without causing GCs (if possible).
+    Heap::CollectAllGarbage();
+  }
  }



--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to