Revision: 10426
Author: [email protected]
Date: Wed Jan 18 01:21:07 2012
Log: When adjusting page's live bytes counter from the mutator adjust
owners unswept free bytes counter.
[email protected]
BUG=
TEST=
Review URL: https://chromiumcodereview.appspot.com/9178021
http://code.google.com/p/v8/source/detail?r=10426
Modified:
/branches/bleeding_edge/src/builtins.cc
/branches/bleeding_edge/src/heap.cc
/branches/bleeding_edge/src/incremental-marking-inl.h
/branches/bleeding_edge/src/incremental-marking.cc
/branches/bleeding_edge/src/mark-compact-inl.h
/branches/bleeding_edge/src/mark-compact.cc
/branches/bleeding_edge/src/mark-compact.h
/branches/bleeding_edge/src/objects.cc
/branches/bleeding_edge/src/runtime.cc
/branches/bleeding_edge/src/spaces-inl.h
/branches/bleeding_edge/src/spaces.cc
/branches/bleeding_edge/src/spaces.h
=======================================
--- /branches/bleeding_edge/src/builtins.cc Fri Jan 13 05:09:52 2012
+++ /branches/bleeding_edge/src/builtins.cc Wed Jan 18 01:21:07 2012
@@ -411,7 +411,7 @@
int size_delta = to_trim * kPointerSize;
if (heap->marking()->TransferMark(elms->address(),
elms->address() + size_delta)) {
- MemoryChunk::IncrementLiveBytes(elms->address(), -size_delta);
+ MemoryChunk::IncrementLiveBytesFromMutator(elms->address(),
-size_delta);
}
return FixedArray::cast(HeapObject::FromAddress(
=======================================
--- /branches/bleeding_edge/src/heap.cc Tue Jan 17 06:29:17 2012
+++ /branches/bleeding_edge/src/heap.cc Wed Jan 18 01:21:07 2012
@@ -1552,7 +1552,7 @@
if (marks_handling == TRANSFER_MARKS) {
if (Marking::TransferColor(source, target)) {
- MemoryChunk::IncrementLiveBytes(target->address(), size);
+ MemoryChunk::IncrementLiveBytesFromGC(target->address(), size);
}
}
}
=======================================
--- /branches/bleeding_edge/src/incremental-marking-inl.h Tue Nov 8
02:28:58 2011
+++ /branches/bleeding_edge/src/incremental-marking-inl.h Wed Jan 18
01:21:07 2012
@@ -95,7 +95,7 @@
ASSERT(IsMarking());
Marking::BlackToGrey(mark_bit);
int obj_size = obj->Size();
- MemoryChunk::IncrementLiveBytes(obj->address(), -obj_size);
+ MemoryChunk::IncrementLiveBytesFromGC(obj->address(), -obj_size);
bytes_scanned_ -= obj_size;
int64_t old_bytes_rescanned = bytes_rescanned_;
bytes_rescanned_ = old_bytes_rescanned + obj_size;
=======================================
--- /branches/bleeding_edge/src/incremental-marking.cc Tue Jan 17 05:13:55
2012
+++ /branches/bleeding_edge/src/incremental-marking.cc Wed Jan 18 01:21:07
2012
@@ -225,8 +225,8 @@
MarkBit mark_bit = Marking::MarkBitFrom(heap_object);
if (mark_bit.data_only()) {
if (incremental_marking_->MarkBlackOrKeepGrey(mark_bit)) {
- MemoryChunk::IncrementLiveBytes(heap_object->address(),
- heap_object->Size());
+ MemoryChunk::IncrementLiveBytesFromGC(heap_object->address(),
+ heap_object->Size());
}
} else if (Marking::IsWhite(mark_bit)) {
incremental_marking_->WhiteToGreyAndPush(heap_object, mark_bit);
@@ -263,8 +263,8 @@
MarkBit mark_bit = Marking::MarkBitFrom(heap_object);
if (mark_bit.data_only()) {
if (incremental_marking_->MarkBlackOrKeepGrey(mark_bit)) {
- MemoryChunk::IncrementLiveBytes(heap_object->address(),
- heap_object->Size());
+ MemoryChunk::IncrementLiveBytesFromGC(heap_object->address(),
+ heap_object->Size());
}
} else {
if (Marking::IsWhite(mark_bit)) {
@@ -491,8 +491,8 @@
HeapObject* heap_obj = HeapObject::cast(obj);
MarkBit mark_bit = Marking::MarkBitFrom(HeapObject::cast(obj));
if (Marking::IsBlack(mark_bit)) {
- MemoryChunk::IncrementLiveBytes(heap_obj->address(),
- -heap_obj->Size());
+ MemoryChunk::IncrementLiveBytesFromGC(heap_obj->address(),
+ -heap_obj->Size());
}
Marking::AnyToGrey(mark_bit);
}
@@ -658,7 +658,7 @@
MarkBit mark_bit = Marking::MarkBitFrom(obj);
ASSERT(!Marking::IsBlack(mark_bit));
Marking::MarkBlack(mark_bit);
- MemoryChunk::IncrementLiveBytes(obj->address(), obj->Size());
+ MemoryChunk::IncrementLiveBytesFromGC(obj->address(), obj->Size());
}
state_ = COMPLETE;
if (FLAG_trace_incremental_marking) {
@@ -671,8 +671,8 @@
if (FLAG_cleanup_code_caches_at_gc) {
PolymorphicCodeCache* poly_cache = heap_->polymorphic_code_cache();
Marking::GreyToBlack(Marking::MarkBitFrom(poly_cache));
- MemoryChunk::IncrementLiveBytes(poly_cache->address(),
- PolymorphicCodeCache::kSize);
+ MemoryChunk::IncrementLiveBytesFromGC(poly_cache->address(),
+ PolymorphicCodeCache::kSize);
}
Object* context = heap_->global_contexts_list();
@@ -685,7 +685,7 @@
MarkBit mark_bit = Marking::MarkBitFrom(cache);
if (Marking::IsGrey(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);
@@ -819,7 +819,7 @@
SLOW_ASSERT(Marking::IsGrey(obj_mark_bit) ||
(obj->IsFiller() && Marking::IsWhite(obj_mark_bit)));
Marking::MarkBlack(obj_mark_bit);
- MemoryChunk::IncrementLiveBytes(obj->address(), size);
+ MemoryChunk::IncrementLiveBytesFromGC(obj->address(), size);
}
if (marking_deque_.IsEmpty()) MarkingComplete();
}
=======================================
--- /branches/bleeding_edge/src/mark-compact-inl.h Tue Oct 25 05:13:06 2011
+++ /branches/bleeding_edge/src/mark-compact-inl.h Wed Jan 18 01:21:07 2012
@@ -53,7 +53,7 @@
ASSERT(Marking::MarkBitFrom(obj) == mark_bit);
if (!mark_bit.Get()) {
mark_bit.Set();
- MemoryChunk::IncrementLiveBytes(obj->address(), obj->Size());
+ MemoryChunk::IncrementLiveBytesFromGC(obj->address(), obj->Size());
ProcessNewlyMarkedObject(obj);
}
}
@@ -63,7 +63,7 @@
ASSERT(!mark_bit.Get());
ASSERT(Marking::MarkBitFrom(obj) == mark_bit);
mark_bit.Set();
- MemoryChunk::IncrementLiveBytes(obj->address(), obj->Size());
+ MemoryChunk::IncrementLiveBytesFromGC(obj->address(), obj->Size());
}
=======================================
--- /branches/bleeding_edge/src/mark-compact.cc Tue Jan 17 06:09:12 2012
+++ /branches/bleeding_edge/src/mark-compact.cc Wed Jan 18 01:21:07 2012
@@ -1641,8 +1641,8 @@
MarkBit mark = Marking::MarkBitFrom(prototype_transitions);
if (!mark.Get()) {
mark.Set();
- MemoryChunk::IncrementLiveBytes(prototype_transitions->address(),
- prototype_transitions->Size());
+ MemoryChunk::IncrementLiveBytesFromGC(prototype_transitions->address(),
+ prototype_transitions->Size());
}
Object** raw_descriptor_array_slot =
@@ -1756,7 +1756,7 @@
MarkBit markbit = Marking::MarkBitFrom(object);
if ((object->map() != filler_map) && Marking::IsGrey(markbit)) {
Marking::GreyToBlack(markbit);
- MemoryChunk::IncrementLiveBytes(object->address(), object->Size());
+ MemoryChunk::IncrementLiveBytesFromGC(object->address(),
object->Size());
marking_deque->PushBlack(object);
if (marking_deque->IsFull()) return;
}
@@ -1808,7 +1808,7 @@
Marking::GreyToBlack(markbit);
Address addr = cell_base + offset * kPointerSize;
HeapObject* object = HeapObject::FromAddress(addr);
- MemoryChunk::IncrementLiveBytes(object->address(), object->Size());
+ MemoryChunk::IncrementLiveBytesFromGC(object->address(),
object->Size());
marking_deque->PushBlack(object);
if (marking_deque->IsFull()) return;
offset += 2;
=======================================
--- /branches/bleeding_edge/src/mark-compact.h Mon Jan 16 04:38:59 2012
+++ /branches/bleeding_edge/src/mark-compact.h Wed Jan 18 01:21:07 2012
@@ -198,7 +198,7 @@
ASSERT(object->IsHeapObject());
if (IsFull()) {
Marking::BlackToGrey(object);
- MemoryChunk::IncrementLiveBytes(object->address(), -object->Size());
+ MemoryChunk::IncrementLiveBytesFromGC(object->address(),
-object->Size());
SetOverflowed();
} else {
array_[top_] = object;
=======================================
--- /branches/bleeding_edge/src/objects.cc Mon Jan 16 04:38:59 2012
+++ /branches/bleeding_edge/src/objects.cc Wed Jan 18 01:21:07 2012
@@ -993,7 +993,8 @@
int new_size = this->Size(); // Byte size of the external String object.
heap->CreateFillerObjectAt(this->address() + new_size, size - new_size);
if (Marking::IsBlack(Marking::MarkBitFrom(this))) {
- MemoryChunk::IncrementLiveBytes(this->address(), new_size - size);
+ MemoryChunk::IncrementLiveBytesFromMutator(this->address(),
+ new_size - size);
}
return true;
}
@@ -1037,7 +1038,8 @@
int new_size = this->Size(); // Byte size of the external String object.
heap->CreateFillerObjectAt(this->address() + new_size, size - new_size);
if (Marking::IsBlack(Marking::MarkBitFrom(this))) {
- MemoryChunk::IncrementLiveBytes(this->address(), new_size - size);
+ MemoryChunk::IncrementLiveBytesFromMutator(this->address(),
+ new_size - size);
}
return true;
}
@@ -3460,7 +3462,8 @@
current_heap->CreateFillerObjectAt(this->address() + new_instance_size,
instance_size_delta);
if (Marking::IsBlack(Marking::MarkBitFrom(this))) {
- MemoryChunk::IncrementLiveBytes(this->address(), -instance_size_delta);
+ MemoryChunk::IncrementLiveBytesFromMutator(this->address(),
+ -instance_size_delta);
}
=======================================
--- /branches/bleeding_edge/src/runtime.cc Tue Jan 17 06:29:17 2012
+++ /branches/bleeding_edge/src/runtime.cc Wed Jan 18 01:21:07 2012
@@ -3178,7 +3178,7 @@
Address end_of_string = answer->address() + string_size;
isolate->heap()->CreateFillerObjectAt(end_of_string, delta);
if (Marking::IsBlack(Marking::MarkBitFrom(*answer))) {
- MemoryChunk::IncrementLiveBytes(answer->address(), -delta);
+ MemoryChunk::IncrementLiveBytesFromMutator(answer->address(), -delta);
}
return *answer;
=======================================
--- /branches/bleeding_edge/src/spaces-inl.h Tue Jan 17 05:13:55 2012
+++ /branches/bleeding_edge/src/spaces-inl.h Wed Jan 18 01:21:07 2012
@@ -332,7 +332,7 @@
string->set_length(length);
if (Marking::IsBlack(Marking::MarkBitFrom(string))) {
int delta = static_cast<int>(old_top - allocation_info_.top);
- MemoryChunk::IncrementLiveBytes(string->address(), -delta);
+ MemoryChunk::IncrementLiveBytesFromMutator(string->address(), -delta);
}
}
=======================================
--- /branches/bleeding_edge/src/spaces.cc Tue Jan 17 06:09:12 2012
+++ /branches/bleeding_edge/src/spaces.cc Wed Jan 18 01:21:07 2012
@@ -647,6 +647,17 @@
capacity_, size_, static_cast<int>(pct*100));
}
#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
@@ -2515,7 +2526,7 @@
MarkBit mark_bit = Marking::MarkBitFrom(object);
if (mark_bit.Get()) {
mark_bit.Clear();
- MemoryChunk::IncrementLiveBytes(object->address(), -object->Size());
+ MemoryChunk::IncrementLiveBytesFromGC(object->address(),
-object->Size());
previous = current;
current = current->next_page();
} else {
=======================================
--- /branches/bleeding_edge/src/spaces.h Tue Jan 17 06:09:12 2012
+++ /branches/bleeding_edge/src/spaces.h Wed Jan 18 01:21:07 2012
@@ -472,9 +472,12 @@
ASSERT(static_cast<unsigned>(live_byte_count_) <= size_);
return live_byte_count_;
}
- static void IncrementLiveBytes(Address address, int by) {
+
+ static void IncrementLiveBytesFromGC(Address address, int by) {
MemoryChunk::FromAddress(address)->IncrementLiveBytes(by);
}
+
+ static void IncrementLiveBytesFromMutator(Address address, int by);
static const intptr_t kAlignment =
(static_cast<uintptr_t>(1) << kPageSizeBits);
@@ -1562,6 +1565,10 @@
if (first == &anchor_) first = NULL;
first_unswept_page_ = first;
}
+
+ void IncrementUnsweptFreeBytes(int by) {
+ unswept_free_bytes_ += by;
+ }
void IncreaseUnsweptFreeBytes(Page* p) {
ASSERT(ShouldBeSweptLazily(p));
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev