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