| 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);
|
| }
|
|
|