Index: runtime/vm/scavenger.cc |
=================================================================== |
--- runtime/vm/scavenger.cc (revision 28687) |
+++ runtime/vm/scavenger.cc (working copy) |
@@ -73,6 +73,8 @@ |
scavenger_(scavenger), |
heap_(scavenger->heap_), |
vm_heap_(Dart::vm_isolate()->heap()), |
+ visited_count_(0), |
+ handled_count_(0), |
delayed_weak_stack_(), |
growth_policy_(PageSpace::kControlGrowth), |
bytes_promoted_(0), |
@@ -113,6 +115,8 @@ |
} |
} |
+ intptr_t visited_count() const { return visited_count_; } |
+ intptr_t handled_count() const { return handled_count_; } |
intptr_t bytes_promoted() const { return bytes_promoted_; } |
private: |
@@ -137,6 +141,7 @@ |
BoolScope bs(&in_scavenge_pointer_, true); |
#endif |
+ visited_count_++; |
RawObject* raw_obj = *p; |
// Fast exit if the raw object is a Smi or an old object. |
@@ -153,6 +158,7 @@ |
return; |
} |
+ handled_count_++; |
// Read the header word of the object and determine if the object has |
// already been copied. |
uword header = *reinterpret_cast<uword*>(raw_addr); |
@@ -237,6 +243,8 @@ |
Scavenger* scavenger_; |
Heap* heap_; |
Heap* vm_heap_; |
+ intptr_t visited_count_; |
+ intptr_t handled_count_; |
typedef std::multimap<RawObject*, RawWeakProperty*> DelaySet; |
DelaySet delay_set_; |
GrowableArray<RawObject*> delayed_weak_stack_; |
@@ -379,16 +387,16 @@ |
void Scavenger::IterateStoreBuffers(Isolate* isolate, |
ScavengerVisitor* visitor) { |
StoreBuffer* buffer = isolate->store_buffer(); |
- heap_->RecordData(kStoreBufferBlockEntries, buffer->Count()); |
+ heap_->RecordData(kStoreBufferEntries, buffer->Count()); |
// Iterating through the store buffers. |
// Grab the deduplication sets out of the store buffer. |
StoreBufferBlock* pending = isolate->store_buffer()->Blocks(); |
- intptr_t entries = 0; |
+ intptr_t visited_count_before = visitor->visited_count(); |
+ intptr_t handled_count_before = visitor->handled_count(); |
while (pending != NULL) { |
StoreBufferBlock* next = pending->next(); |
intptr_t count = pending->Count(); |
- entries += count; |
for (intptr_t i = 0; i < count; i++) { |
RawObject* raw_object = pending->At(i); |
ASSERT(raw_object->IsRemembered()); |
@@ -399,7 +407,10 @@ |
delete pending; |
pending = next; |
} |
- heap_->RecordData(kStoreBufferEntries, entries); |
+ heap_->RecordData(kStoreBufferVisited, |
+ visitor->visited_count() - visited_count_before); |
+ heap_->RecordData(kStoreBufferPointers, |
+ visitor->handled_count() - handled_count_before); |
// Done iterating through old objects remembered in the store buffers. |
visitor->VisitingOldObject(NULL); |
} |
@@ -428,6 +439,7 @@ |
IterateStoreBuffers(isolate, visitor); |
IterateObjectIdTable(isolate, visitor); |
int64_t end = OS::GetCurrentTimeMicros(); |
+ heap_->RecordData(kToKBAfterStoreBuffer, (in_use() + (KB >> 1)) >> KBLog2); |
heap_->RecordTime(kVisitIsolateRoots, middle - start); |
heap_->RecordTime(kIterateStoreBuffers, end - middle); |
} |