From 3e9891c1d09a1c54a08011a8aac888947d864c4d Mon Sep 17 00:00:00 2001 From: "vegorov@chromium.org" Date: Thu, 29 Sep 2011 13:51:47 +0000 Subject: [PATCH] Enable code flushing for full (non-incremental) collections. This will ensure that we will flush code when we hit memory limits. R=erik.corry@gmail.com BUG=v8:1609 Review URL: http://codereview.chromium.org/8060053 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@9484 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/flag-definitions.h | 2 +- src/mark-compact.cc | 13 ++++++------- test/cctest/test-heap.cc | 17 +++++++++-------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/flag-definitions.h b/src/flag-definitions.h index 23b3a24..379803f 100644 --- a/src/flag-definitions.h +++ b/src/flag-definitions.h @@ -258,7 +258,7 @@ DEFINE_bool(trace_fragmentation, false, "report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true, "garbage collect maps from which no objects can be reached") -DEFINE_bool(flush_code, false, +DEFINE_bool(flush_code, true, "flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true, "use incremental marking") DEFINE_bool(incremental_marking_steps, true, "do incremental marking steps") diff --git a/src/mark-compact.cc b/src/mark-compact.cc index 0bcac78..27e3763 100644 --- a/src/mark-compact.cc +++ b/src/mark-compact.cc @@ -467,8 +467,6 @@ void MarkCompactCollector::AbortCompaction() { void MarkCompactCollector::Prepare(GCTracer* tracer) { - FLAG_flush_code = false; - was_marked_incrementally_ = heap()->incremental_marking()->IsMarking(); // Disable collection of maps if incremental marking is enabled. @@ -485,7 +483,6 @@ void MarkCompactCollector::Prepare(GCTracer* tracer) { state_ = PREPARE_GC; #endif - // TODO(1726) Revert this into an assertion when compaction is enabled. ASSERT(!FLAG_never_compact || !FLAG_always_compact); if (collect_maps_) CreateBackPointers(); @@ -1422,7 +1419,8 @@ class SharedFunctionInfoMarkingVisitor : public ObjectVisitor { void MarkCompactCollector::PrepareForCodeFlushing() { ASSERT(heap() == Isolate::Current()->heap()); - if (!FLAG_flush_code) { + // TODO(1609) Currently incremental marker does not support code flushing. + if (!FLAG_flush_code || was_marked_incrementally_) { EnableCodeFlushing(false); return; } @@ -1434,6 +1432,7 @@ void MarkCompactCollector::PrepareForCodeFlushing() { return; } #endif + EnableCodeFlushing(true); // Ensure that empty descriptor array is marked. Method MarkDescriptorArray @@ -3641,9 +3640,6 @@ void MarkCompactCollector::SweepSpaces() { } -// TODO(1466) ReportDeleteIfNeeded is not called currently. -// Our profiling tools do not expect intersections between -// code objects. We should either reenable it or change our tools. void MarkCompactCollector::EnableCodeFlushing(bool enable) { if (enable) { if (code_flusher_ != NULL) return; @@ -3656,6 +3652,9 @@ void MarkCompactCollector::EnableCodeFlushing(bool enable) { } +// TODO(1466) ReportDeleteIfNeeded is not called currently. +// Our profiling tools do not expect intersections between +// code objects. We should either reenable it or change our tools. void MarkCompactCollector::ReportDeleteIfNeeded(HeapObject* obj, Isolate* isolate) { #ifdef ENABLE_GDB_JIT_INTERFACE diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc index 40482be..8ed5bf7 100644 --- a/test/cctest/test-heap.cc +++ b/test/cctest/test-heap.cc @@ -961,17 +961,18 @@ TEST(TestCodeFlushing) { Handle function(JSFunction::cast(func_value)); CHECK(function->shared()->is_compiled()); - HEAP->CollectAllGarbage(Heap::kNoGCFlags); - HEAP->CollectAllGarbage(Heap::kNoGCFlags); + // TODO(1609) Currently incremental marker does not support code flushing. + HEAP->CollectAllGarbage(Heap::kMakeHeapIterableMask); + HEAP->CollectAllGarbage(Heap::kMakeHeapIterableMask); CHECK(function->shared()->is_compiled()); - HEAP->CollectAllGarbage(Heap::kNoGCFlags); - HEAP->CollectAllGarbage(Heap::kNoGCFlags); - HEAP->CollectAllGarbage(Heap::kNoGCFlags); - HEAP->CollectAllGarbage(Heap::kNoGCFlags); - HEAP->CollectAllGarbage(Heap::kNoGCFlags); - HEAP->CollectAllGarbage(Heap::kNoGCFlags); + HEAP->CollectAllGarbage(Heap::kMakeHeapIterableMask); + HEAP->CollectAllGarbage(Heap::kMakeHeapIterableMask); + HEAP->CollectAllGarbage(Heap::kMakeHeapIterableMask); + HEAP->CollectAllGarbage(Heap::kMakeHeapIterableMask); + HEAP->CollectAllGarbage(Heap::kMakeHeapIterableMask); + HEAP->CollectAllGarbage(Heap::kMakeHeapIterableMask); // foo should no longer be in the compilation cache CHECK(!function->shared()->is_compiled() || function->IsOptimized()); -- 2.7.4