Commit 1b80e82f authored by ulan@chromium.org's avatar ulan@chromium.org

Fix counting of scanned bytes in incremental marking step for large object.

R=mstarzinger@chromium.org
BUG=241815

Review URL: https://chromiumcodereview.appspot.com/15745004

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14877 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent bc9bc0de
......@@ -54,7 +54,8 @@ IncrementalMarking::IncrementalMarking(Heap* heap)
should_hurry_(false),
marking_speed_(0),
allocated_(0),
no_marking_scope_depth_(0) {
no_marking_scope_depth_(0),
unscanned_bytes_of_large_object_(0) {
}
......@@ -241,6 +242,7 @@ class IncrementalMarkingMarkingVisitor
chunk->progress_bar());
int end_offset = Min(object_size,
start_offset + kProgressBarScanningChunk);
int already_scanned_offset = start_offset;
bool scan_until_end = false;
do {
VisitPointersWithAnchor(heap,
......@@ -254,6 +256,8 @@ class IncrementalMarkingMarkingVisitor
chunk->set_progress_bar(start_offset);
if (start_offset < object_size) {
heap->incremental_marking()->marking_deque()->UnshiftGrey(object);
heap->incremental_marking()->NotifyIncompleteScanOfObject(
object_size - (start_offset - already_scanned_offset));
}
} else {
FixedArrayVisitor::Visit(map, object);
......@@ -739,8 +743,9 @@ void IncrementalMarking::ProcessMarkingDeque(intptr_t bytes_to_process) {
if (map == filler_map) continue;
int size = obj->SizeFromMap(map);
bytes_to_process -= size;
unscanned_bytes_of_large_object_ = 0;
VisitObject(map, obj, size);
bytes_to_process -= (size - unscanned_bytes_of_large_object_);
}
}
......
......@@ -220,6 +220,10 @@ class IncrementalMarking {
void UncommitMarkingDeque();
void NotifyIncompleteScanOfObject(int unscanned_bytes) {
unscanned_bytes_of_large_object_ = unscanned_bytes;
}
private:
int64_t SpaceLeftInOldSpace();
......@@ -274,6 +278,8 @@ class IncrementalMarking {
int no_marking_scope_depth_;
int unscanned_bytes_of_large_object_;
DISALLOW_IMPLICIT_CONSTRUCTORS(IncrementalMarking);
};
......
......@@ -3107,3 +3107,19 @@ TEST(DeferredHandles) {
isolate->handle_scope_implementer()->Iterate(&visitor);
deferred.Detach();
}
TEST(IncrementalMarkingStepMakesBigProgressWithLargeObjects) {
CcTest::InitializeVM();
v8::HandleScope scope(CcTest::isolate());
CompileRun("function f(n) {"
" var a = new Array(n);"
" for (var i = 0; i < n; i += 100) a[i] = i;"
"};"
"f(10 * 1024 * 1024);");
IncrementalMarking* marking = HEAP->incremental_marking();
if (marking->IsStopped()) marking->Start();
// This big step should be sufficient to mark the whole array.
marking->Step(100 * MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD);
ASSERT(marking->IsComplete());
}
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