Commit 3fd6ba10 authored by vegorov@chromium.org's avatar vegorov@chromium.org

When adjusting page's live bytes counter from the mutator adjust owners unswept free bytes counter.

R=mstarzinger@chromium.org
BUG=
TEST=

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

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10426 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 01979c70
...@@ -411,7 +411,7 @@ static FixedArray* LeftTrimFixedArray(Heap* heap, ...@@ -411,7 +411,7 @@ static FixedArray* LeftTrimFixedArray(Heap* heap,
int size_delta = to_trim * kPointerSize; int size_delta = to_trim * kPointerSize;
if (heap->marking()->TransferMark(elms->address(), if (heap->marking()->TransferMark(elms->address(),
elms->address() + size_delta)) { elms->address() + size_delta)) {
MemoryChunk::IncrementLiveBytes(elms->address(), -size_delta); MemoryChunk::IncrementLiveBytesFromMutator(elms->address(), -size_delta);
} }
return FixedArray::cast(HeapObject::FromAddress( return FixedArray::cast(HeapObject::FromAddress(
......
...@@ -1552,7 +1552,7 @@ class ScavengingVisitor : public StaticVisitorBase { ...@@ -1552,7 +1552,7 @@ class ScavengingVisitor : public StaticVisitorBase {
if (marks_handling == TRANSFER_MARKS) { if (marks_handling == TRANSFER_MARKS) {
if (Marking::TransferColor(source, target)) { if (Marking::TransferColor(source, target)) {
MemoryChunk::IncrementLiveBytes(target->address(), size); MemoryChunk::IncrementLiveBytesFromGC(target->address(), size);
} }
} }
} }
......
...@@ -95,7 +95,7 @@ void IncrementalMarking::BlackToGreyAndUnshift(HeapObject* obj, ...@@ -95,7 +95,7 @@ void IncrementalMarking::BlackToGreyAndUnshift(HeapObject* obj,
ASSERT(IsMarking()); ASSERT(IsMarking());
Marking::BlackToGrey(mark_bit); Marking::BlackToGrey(mark_bit);
int obj_size = obj->Size(); int obj_size = obj->Size();
MemoryChunk::IncrementLiveBytes(obj->address(), -obj_size); MemoryChunk::IncrementLiveBytesFromGC(obj->address(), -obj_size);
bytes_scanned_ -= obj_size; bytes_scanned_ -= obj_size;
int64_t old_bytes_rescanned = bytes_rescanned_; int64_t old_bytes_rescanned = bytes_rescanned_;
bytes_rescanned_ = old_bytes_rescanned + obj_size; bytes_rescanned_ = old_bytes_rescanned + obj_size;
......
...@@ -225,8 +225,8 @@ class IncrementalMarkingMarkingVisitor : public ObjectVisitor { ...@@ -225,8 +225,8 @@ class IncrementalMarkingMarkingVisitor : public ObjectVisitor {
MarkBit mark_bit = Marking::MarkBitFrom(heap_object); MarkBit mark_bit = Marking::MarkBitFrom(heap_object);
if (mark_bit.data_only()) { if (mark_bit.data_only()) {
if (incremental_marking_->MarkBlackOrKeepGrey(mark_bit)) { if (incremental_marking_->MarkBlackOrKeepGrey(mark_bit)) {
MemoryChunk::IncrementLiveBytes(heap_object->address(), MemoryChunk::IncrementLiveBytesFromGC(heap_object->address(),
heap_object->Size()); heap_object->Size());
} }
} else if (Marking::IsWhite(mark_bit)) { } else if (Marking::IsWhite(mark_bit)) {
incremental_marking_->WhiteToGreyAndPush(heap_object, mark_bit); incremental_marking_->WhiteToGreyAndPush(heap_object, mark_bit);
...@@ -263,8 +263,8 @@ class IncrementalMarkingRootMarkingVisitor : public ObjectVisitor { ...@@ -263,8 +263,8 @@ class IncrementalMarkingRootMarkingVisitor : public ObjectVisitor {
MarkBit mark_bit = Marking::MarkBitFrom(heap_object); MarkBit mark_bit = Marking::MarkBitFrom(heap_object);
if (mark_bit.data_only()) { if (mark_bit.data_only()) {
if (incremental_marking_->MarkBlackOrKeepGrey(mark_bit)) { if (incremental_marking_->MarkBlackOrKeepGrey(mark_bit)) {
MemoryChunk::IncrementLiveBytes(heap_object->address(), MemoryChunk::IncrementLiveBytesFromGC(heap_object->address(),
heap_object->Size()); heap_object->Size());
} }
} else { } else {
if (Marking::IsWhite(mark_bit)) { if (Marking::IsWhite(mark_bit)) {
...@@ -491,8 +491,8 @@ static void MarkObjectGreyDoNotEnqueue(Object* obj) { ...@@ -491,8 +491,8 @@ static void MarkObjectGreyDoNotEnqueue(Object* obj) {
HeapObject* heap_obj = HeapObject::cast(obj); HeapObject* heap_obj = HeapObject::cast(obj);
MarkBit mark_bit = Marking::MarkBitFrom(HeapObject::cast(obj)); MarkBit mark_bit = Marking::MarkBitFrom(HeapObject::cast(obj));
if (Marking::IsBlack(mark_bit)) { if (Marking::IsBlack(mark_bit)) {
MemoryChunk::IncrementLiveBytes(heap_obj->address(), MemoryChunk::IncrementLiveBytesFromGC(heap_obj->address(),
-heap_obj->Size()); -heap_obj->Size());
} }
Marking::AnyToGrey(mark_bit); Marking::AnyToGrey(mark_bit);
} }
...@@ -658,7 +658,7 @@ void IncrementalMarking::Hurry() { ...@@ -658,7 +658,7 @@ void IncrementalMarking::Hurry() {
MarkBit mark_bit = Marking::MarkBitFrom(obj); MarkBit mark_bit = Marking::MarkBitFrom(obj);
ASSERT(!Marking::IsBlack(mark_bit)); ASSERT(!Marking::IsBlack(mark_bit));
Marking::MarkBlack(mark_bit); Marking::MarkBlack(mark_bit);
MemoryChunk::IncrementLiveBytes(obj->address(), obj->Size()); MemoryChunk::IncrementLiveBytesFromGC(obj->address(), obj->Size());
} }
state_ = COMPLETE; state_ = COMPLETE;
if (FLAG_trace_incremental_marking) { if (FLAG_trace_incremental_marking) {
...@@ -671,8 +671,8 @@ void IncrementalMarking::Hurry() { ...@@ -671,8 +671,8 @@ void IncrementalMarking::Hurry() {
if (FLAG_cleanup_code_caches_at_gc) { if (FLAG_cleanup_code_caches_at_gc) {
PolymorphicCodeCache* poly_cache = heap_->polymorphic_code_cache(); PolymorphicCodeCache* poly_cache = heap_->polymorphic_code_cache();
Marking::GreyToBlack(Marking::MarkBitFrom(poly_cache)); Marking::GreyToBlack(Marking::MarkBitFrom(poly_cache));
MemoryChunk::IncrementLiveBytes(poly_cache->address(), MemoryChunk::IncrementLiveBytesFromGC(poly_cache->address(),
PolymorphicCodeCache::kSize); PolymorphicCodeCache::kSize);
} }
Object* context = heap_->global_contexts_list(); Object* context = heap_->global_contexts_list();
...@@ -685,7 +685,7 @@ void IncrementalMarking::Hurry() { ...@@ -685,7 +685,7 @@ void IncrementalMarking::Hurry() {
MarkBit mark_bit = Marking::MarkBitFrom(cache); MarkBit mark_bit = Marking::MarkBitFrom(cache);
if (Marking::IsGrey(mark_bit)) { if (Marking::IsGrey(mark_bit)) {
Marking::GreyToBlack(mark_bit); Marking::GreyToBlack(mark_bit);
MemoryChunk::IncrementLiveBytes(cache->address(), cache->Size()); MemoryChunk::IncrementLiveBytesFromGC(cache->address(), cache->Size());
} }
} }
context = Context::cast(context)->get(Context::NEXT_CONTEXT_LINK); context = Context::cast(context)->get(Context::NEXT_CONTEXT_LINK);
...@@ -819,7 +819,7 @@ void IncrementalMarking::Step(intptr_t allocated_bytes) { ...@@ -819,7 +819,7 @@ void IncrementalMarking::Step(intptr_t allocated_bytes) {
SLOW_ASSERT(Marking::IsGrey(obj_mark_bit) || SLOW_ASSERT(Marking::IsGrey(obj_mark_bit) ||
(obj->IsFiller() && Marking::IsWhite(obj_mark_bit))); (obj->IsFiller() && Marking::IsWhite(obj_mark_bit)));
Marking::MarkBlack(obj_mark_bit); Marking::MarkBlack(obj_mark_bit);
MemoryChunk::IncrementLiveBytes(obj->address(), size); MemoryChunk::IncrementLiveBytesFromGC(obj->address(), size);
} }
if (marking_deque_.IsEmpty()) MarkingComplete(); if (marking_deque_.IsEmpty()) MarkingComplete();
} }
......
...@@ -53,7 +53,7 @@ void MarkCompactCollector::MarkObject(HeapObject* obj, MarkBit mark_bit) { ...@@ -53,7 +53,7 @@ void MarkCompactCollector::MarkObject(HeapObject* obj, MarkBit mark_bit) {
ASSERT(Marking::MarkBitFrom(obj) == mark_bit); ASSERT(Marking::MarkBitFrom(obj) == mark_bit);
if (!mark_bit.Get()) { if (!mark_bit.Get()) {
mark_bit.Set(); mark_bit.Set();
MemoryChunk::IncrementLiveBytes(obj->address(), obj->Size()); MemoryChunk::IncrementLiveBytesFromGC(obj->address(), obj->Size());
ProcessNewlyMarkedObject(obj); ProcessNewlyMarkedObject(obj);
} }
} }
...@@ -63,7 +63,7 @@ void MarkCompactCollector::SetMark(HeapObject* obj, MarkBit mark_bit) { ...@@ -63,7 +63,7 @@ void MarkCompactCollector::SetMark(HeapObject* obj, MarkBit mark_bit) {
ASSERT(!mark_bit.Get()); ASSERT(!mark_bit.Get());
ASSERT(Marking::MarkBitFrom(obj) == mark_bit); ASSERT(Marking::MarkBitFrom(obj) == mark_bit);
mark_bit.Set(); mark_bit.Set();
MemoryChunk::IncrementLiveBytes(obj->address(), obj->Size()); MemoryChunk::IncrementLiveBytesFromGC(obj->address(), obj->Size());
} }
......
...@@ -1641,8 +1641,8 @@ void MarkCompactCollector::MarkMapContents(Map* map) { ...@@ -1641,8 +1641,8 @@ void MarkCompactCollector::MarkMapContents(Map* map) {
MarkBit mark = Marking::MarkBitFrom(prototype_transitions); MarkBit mark = Marking::MarkBitFrom(prototype_transitions);
if (!mark.Get()) { if (!mark.Get()) {
mark.Set(); mark.Set();
MemoryChunk::IncrementLiveBytes(prototype_transitions->address(), MemoryChunk::IncrementLiveBytesFromGC(prototype_transitions->address(),
prototype_transitions->Size()); prototype_transitions->Size());
} }
Object** raw_descriptor_array_slot = Object** raw_descriptor_array_slot =
...@@ -1756,7 +1756,7 @@ static void DiscoverGreyObjectsWithIterator(Heap* heap, ...@@ -1756,7 +1756,7 @@ static void DiscoverGreyObjectsWithIterator(Heap* heap,
MarkBit markbit = Marking::MarkBitFrom(object); MarkBit markbit = Marking::MarkBitFrom(object);
if ((object->map() != filler_map) && Marking::IsGrey(markbit)) { if ((object->map() != filler_map) && Marking::IsGrey(markbit)) {
Marking::GreyToBlack(markbit); Marking::GreyToBlack(markbit);
MemoryChunk::IncrementLiveBytes(object->address(), object->Size()); MemoryChunk::IncrementLiveBytesFromGC(object->address(), object->Size());
marking_deque->PushBlack(object); marking_deque->PushBlack(object);
if (marking_deque->IsFull()) return; if (marking_deque->IsFull()) return;
} }
...@@ -1808,7 +1808,7 @@ static void DiscoverGreyObjectsOnPage(MarkingDeque* marking_deque, Page* p) { ...@@ -1808,7 +1808,7 @@ static void DiscoverGreyObjectsOnPage(MarkingDeque* marking_deque, Page* p) {
Marking::GreyToBlack(markbit); Marking::GreyToBlack(markbit);
Address addr = cell_base + offset * kPointerSize; Address addr = cell_base + offset * kPointerSize;
HeapObject* object = HeapObject::FromAddress(addr); HeapObject* object = HeapObject::FromAddress(addr);
MemoryChunk::IncrementLiveBytes(object->address(), object->Size()); MemoryChunk::IncrementLiveBytesFromGC(object->address(), object->Size());
marking_deque->PushBlack(object); marking_deque->PushBlack(object);
if (marking_deque->IsFull()) return; if (marking_deque->IsFull()) return;
offset += 2; offset += 2;
......
...@@ -198,7 +198,7 @@ class MarkingDeque { ...@@ -198,7 +198,7 @@ class MarkingDeque {
ASSERT(object->IsHeapObject()); ASSERT(object->IsHeapObject());
if (IsFull()) { if (IsFull()) {
Marking::BlackToGrey(object); Marking::BlackToGrey(object);
MemoryChunk::IncrementLiveBytes(object->address(), -object->Size()); MemoryChunk::IncrementLiveBytesFromGC(object->address(), -object->Size());
SetOverflowed(); SetOverflowed();
} else { } else {
array_[top_] = object; array_[top_] = object;
......
...@@ -993,7 +993,8 @@ bool String::MakeExternal(v8::String::ExternalStringResource* resource) { ...@@ -993,7 +993,8 @@ bool String::MakeExternal(v8::String::ExternalStringResource* resource) {
int new_size = this->Size(); // Byte size of the external String object. int new_size = this->Size(); // Byte size of the external String object.
heap->CreateFillerObjectAt(this->address() + new_size, size - new_size); heap->CreateFillerObjectAt(this->address() + new_size, size - new_size);
if (Marking::IsBlack(Marking::MarkBitFrom(this))) { if (Marking::IsBlack(Marking::MarkBitFrom(this))) {
MemoryChunk::IncrementLiveBytes(this->address(), new_size - size); MemoryChunk::IncrementLiveBytesFromMutator(this->address(),
new_size - size);
} }
return true; return true;
} }
...@@ -1037,7 +1038,8 @@ bool String::MakeExternal(v8::String::ExternalAsciiStringResource* resource) { ...@@ -1037,7 +1038,8 @@ bool String::MakeExternal(v8::String::ExternalAsciiStringResource* resource) {
int new_size = this->Size(); // Byte size of the external String object. int new_size = this->Size(); // Byte size of the external String object.
heap->CreateFillerObjectAt(this->address() + new_size, size - new_size); heap->CreateFillerObjectAt(this->address() + new_size, size - new_size);
if (Marking::IsBlack(Marking::MarkBitFrom(this))) { if (Marking::IsBlack(Marking::MarkBitFrom(this))) {
MemoryChunk::IncrementLiveBytes(this->address(), new_size - size); MemoryChunk::IncrementLiveBytesFromMutator(this->address(),
new_size - size);
} }
return true; return true;
} }
...@@ -3460,7 +3462,8 @@ MaybeObject* JSObject::NormalizeProperties(PropertyNormalizationMode mode, ...@@ -3460,7 +3462,8 @@ MaybeObject* JSObject::NormalizeProperties(PropertyNormalizationMode mode,
current_heap->CreateFillerObjectAt(this->address() + new_instance_size, current_heap->CreateFillerObjectAt(this->address() + new_instance_size,
instance_size_delta); instance_size_delta);
if (Marking::IsBlack(Marking::MarkBitFrom(this))) { if (Marking::IsBlack(Marking::MarkBitFrom(this))) {
MemoryChunk::IncrementLiveBytes(this->address(), -instance_size_delta); MemoryChunk::IncrementLiveBytesFromMutator(this->address(),
-instance_size_delta);
} }
......
...@@ -3178,7 +3178,7 @@ MUST_USE_RESULT static MaybeObject* StringReplaceRegExpWithEmptyString( ...@@ -3178,7 +3178,7 @@ MUST_USE_RESULT static MaybeObject* StringReplaceRegExpWithEmptyString(
Address end_of_string = answer->address() + string_size; Address end_of_string = answer->address() + string_size;
isolate->heap()->CreateFillerObjectAt(end_of_string, delta); isolate->heap()->CreateFillerObjectAt(end_of_string, delta);
if (Marking::IsBlack(Marking::MarkBitFrom(*answer))) { if (Marking::IsBlack(Marking::MarkBitFrom(*answer))) {
MemoryChunk::IncrementLiveBytes(answer->address(), -delta); MemoryChunk::IncrementLiveBytesFromMutator(answer->address(), -delta);
} }
return *answer; return *answer;
......
...@@ -332,7 +332,7 @@ void NewSpace::ShrinkStringAtAllocationBoundary(String* string, int length) { ...@@ -332,7 +332,7 @@ void NewSpace::ShrinkStringAtAllocationBoundary(String* string, int length) {
string->set_length(length); string->set_length(length);
if (Marking::IsBlack(Marking::MarkBitFrom(string))) { if (Marking::IsBlack(Marking::MarkBitFrom(string))) {
int delta = static_cast<int>(old_top - allocation_info_.top); int delta = static_cast<int>(old_top - allocation_info_.top);
MemoryChunk::IncrementLiveBytes(string->address(), -delta); MemoryChunk::IncrementLiveBytesFromMutator(string->address(), -delta);
} }
} }
......
...@@ -648,6 +648,17 @@ void MemoryAllocator::ReportStatistics() { ...@@ -648,6 +648,17 @@ void MemoryAllocator::ReportStatistics() {
} }
#endif #endif
// -----------------------------------------------------------------------------
// MemoryChunk implementation
void MemoryChunk::IncrementLiveBytesFromMutator(Address address, int by) {
MemoryChunk* chunk = MemoryChunk::FromAddress(address);
if (!chunk->InNewSpace() && !static_cast<Page*>(chunk)->WasSwept()) {
static_cast<PagedSpace*>(chunk->owner())->IncrementUnsweptFreeBytes(-by);
}
chunk->IncrementLiveBytes(by);
}
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// PagedSpace implementation // PagedSpace implementation
...@@ -2515,7 +2526,7 @@ void LargeObjectSpace::FreeUnmarkedObjects() { ...@@ -2515,7 +2526,7 @@ void LargeObjectSpace::FreeUnmarkedObjects() {
MarkBit mark_bit = Marking::MarkBitFrom(object); MarkBit mark_bit = Marking::MarkBitFrom(object);
if (mark_bit.Get()) { if (mark_bit.Get()) {
mark_bit.Clear(); mark_bit.Clear();
MemoryChunk::IncrementLiveBytes(object->address(), -object->Size()); MemoryChunk::IncrementLiveBytesFromGC(object->address(), -object->Size());
previous = current; previous = current;
current = current->next_page(); current = current->next_page();
} else { } else {
......
...@@ -472,10 +472,13 @@ class MemoryChunk { ...@@ -472,10 +472,13 @@ class MemoryChunk {
ASSERT(static_cast<unsigned>(live_byte_count_) <= size_); ASSERT(static_cast<unsigned>(live_byte_count_) <= size_);
return live_byte_count_; return live_byte_count_;
} }
static void IncrementLiveBytes(Address address, int by) {
static void IncrementLiveBytesFromGC(Address address, int by) {
MemoryChunk::FromAddress(address)->IncrementLiveBytes(by); MemoryChunk::FromAddress(address)->IncrementLiveBytes(by);
} }
static void IncrementLiveBytesFromMutator(Address address, int by);
static const intptr_t kAlignment = static const intptr_t kAlignment =
(static_cast<uintptr_t>(1) << kPageSizeBits); (static_cast<uintptr_t>(1) << kPageSizeBits);
...@@ -1563,6 +1566,10 @@ class PagedSpace : public Space { ...@@ -1563,6 +1566,10 @@ class PagedSpace : public Space {
first_unswept_page_ = first; first_unswept_page_ = first;
} }
void IncrementUnsweptFreeBytes(int by) {
unswept_free_bytes_ += by;
}
void IncreaseUnsweptFreeBytes(Page* p) { void IncreaseUnsweptFreeBytes(Page* p) {
ASSERT(ShouldBeSweptLazily(p)); ASSERT(ShouldBeSweptLazily(p));
unswept_free_bytes_ += (Page::kObjectAreaSize - p->LiveBytes()); unswept_free_bytes_ += (Page::kObjectAreaSize - p->LiveBytes());
......
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