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
-~----------~----~----~----~------~----~------~--~---