Chromium Code Reviews| Index: runtime/vm/scavenger.cc |
| diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc |
| index 8d6e4bf5be189dedb5a462cb1a672fb9afa992e9..6ee946374bed7f401b8318b6d232e2902ee34616 100644 |
| --- a/runtime/vm/scavenger.cc |
| +++ b/runtime/vm/scavenger.cc |
| @@ -404,6 +404,17 @@ void Scavenger::IterateStoreBuffers(Isolate* isolate, |
| } |
| +void Scavenger::IterateObjectIdTable(Isolate* isolate, |
| + ScavengerVisitor* visitor) { |
| + RawObject** table = heap_->get_object_id_ring_table(); |
| + const intptr_t table_size = heap_->get_object_id_ring_table_size(); |
| + if ((table == NULL) || (table_size <= 0)) { |
| + return; |
| + } |
| + visitor->VisitPointers(&table[0], &table[table_size]); |
| +} |
| + |
| + |
| void Scavenger::IterateRoots(Isolate* isolate, |
| ScavengerVisitor* visitor, |
| bool visit_prologue_weak_persistent_handles) { |
| @@ -413,6 +424,7 @@ void Scavenger::IterateRoots(Isolate* isolate, |
| StackFrameIterator::kDontValidateFrames); |
| int64_t middle = OS::GetCurrentTimeMicros(); |
| IterateStoreBuffers(isolate, visitor); |
| + IterateObjectIdTable(isolate, visitor); |
| int64_t end = OS::GetCurrentTimeMicros(); |
| heap_->RecordTime(kVisitIsolateRoots, middle - start); |
| heap_->RecordTime(kIterateStoreBuffers, end - middle); |
| @@ -590,6 +602,31 @@ void Scavenger::ProcessWeakTables() { |
| } |
| +void Scavenger::ProcessObjectIdTable() { |
| + RawObject** table = heap_->get_object_id_ring_table(); |
|
Ivan Posva
2013/07/10 01:10:13
It would be better if we used a pointer visitor he
Cutch
2013/07/10 17:23:10
All accesses to the ring table via the scavenger a
|
| + const intptr_t table_size = heap_->get_object_id_ring_table_size(); |
| + if ((table == NULL) || (table_size <= 0)) { |
| + return; |
| + } |
| + for (intptr_t i = 0; i < table_size; i++) { |
| + RawObject* raw_obj = table[i]; |
| + ASSERT(raw_obj->IsHeapObject()); |
| + if (raw_obj->IsOldObject()) { |
| + // SKip old objects. |
| + continue; |
| + } |
| + uword raw_addr = RawObject::ToAddr(raw_obj); |
| + uword header = *reinterpret_cast<uword*>(raw_addr); |
| + if (IsForwarding(header)) { |
| + // The object has survived. Update its address in the table. |
| + uword new_addr = ForwardedAddr(header); |
| + raw_obj = RawObject::FromAddr(new_addr); |
| + table[i] = raw_obj; |
| + } |
| + } |
| +} |
| + |
| + |
| void Scavenger::VisitObjectPointers(ObjectPointerVisitor* visitor) const { |
| uword cur = FirstObjectStart(); |
| while (cur < top_) { |
| @@ -642,6 +679,7 @@ void Scavenger::Scavenge(bool invoke_api_callbacks) { |
| IterateWeakRoots(isolate, &weak_visitor, invoke_api_callbacks); |
| visitor.Finalize(); |
| ProcessWeakTables(); |
| + ProcessObjectIdTable(); |
| int64_t end = OS::GetCurrentTimeMicros(); |
| heap_->RecordTime(kProcessToSpace, middle - start); |
| heap_->RecordTime(kIterateWeaks, end - middle); |