summaryrefslogtreecommitdiffstats
path: root/runtime/gc/collector/mark_sweep.cc
diff options
context:
space:
mode:
authorMathieu Chartier <mathieuc@google.com>2014-02-13 18:02:13 -0800
committerMathieu Chartier <mathieuc@google.com>2014-02-18 10:45:12 -0800
commit815873ecc312b1d231acce71e1a16f42cdaf09f2 (patch)
tree18ba2fa951775e60b240271bfe975e6e2cfc654c /runtime/gc/collector/mark_sweep.cc
parent2befd09cf4fe89a18a655f3e1dd310831bfa769f (diff)
downloadart-815873ecc312b1d231acce71e1a16f42cdaf09f2.zip
art-815873ecc312b1d231acce71e1a16f42cdaf09f2.tar.gz
art-815873ecc312b1d231acce71e1a16f42cdaf09f2.tar.bz2
Change root visitor to use Object**.
Simplifies code and improves the performance of root visiting since we usually don't need to check to see if the object moved. Change-Id: Iba998f5a15ae1fa1b53ca5226dd2168a411196cf
Diffstat (limited to 'runtime/gc/collector/mark_sweep.cc')
-rw-r--r--runtime/gc/collector/mark_sweep.cc23
1 files changed, 14 insertions, 9 deletions
diff --git a/runtime/gc/collector/mark_sweep.cc b/runtime/gc/collector/mark_sweep.cc
index dbbc115..006c271 100644
--- a/runtime/gc/collector/mark_sweep.cc
+++ b/runtime/gc/collector/mark_sweep.cc
@@ -273,7 +273,7 @@ void MarkSweep::UpdateAndMarkModUnion() {
TimingLogger::ScopedSplit split(name, &timings_);
accounting::ModUnionTable* mod_union_table = heap_->FindModUnionTableFromSpace(space);
CHECK(mod_union_table != nullptr);
- mod_union_table->UpdateAndMarkReferences(MarkRootCallback, this);
+ mod_union_table->UpdateAndMarkReferences(MarkObjectCallback, this);
}
}
}
@@ -532,20 +532,25 @@ void MarkSweep::MarkRoot(const Object* obj) {
}
}
-mirror::Object* MarkSweep::MarkRootParallelCallback(mirror::Object* root, void* arg,
- uint32_t /*thread_id*/, RootType /*root_type*/) {
+void MarkSweep::MarkRootParallelCallback(mirror::Object** root, void* arg, uint32_t /*thread_id*/,
+ RootType /*root_type*/) {
DCHECK(root != NULL);
DCHECK(arg != NULL);
- reinterpret_cast<MarkSweep*>(arg)->MarkObjectNonNullParallel(root);
- return root;
+ reinterpret_cast<MarkSweep*>(arg)->MarkObjectNonNullParallel(*root);
}
-Object* MarkSweep::MarkRootCallback(Object* root, void* arg, uint32_t /*thread_id*/,
- RootType /*root_type*/) {
+void MarkSweep::MarkRootCallback(Object** root, void* arg, uint32_t /*thread_id*/,
+ RootType /*root_type*/) {
DCHECK(root != nullptr);
DCHECK(arg != nullptr);
- reinterpret_cast<MarkSweep*>(arg)->MarkObjectNonNull(root);
- return root;
+ reinterpret_cast<MarkSweep*>(arg)->MarkObjectNonNull(*root);
+}
+
+mirror::Object* MarkSweep::MarkObjectCallback(mirror::Object* object, void* arg) {
+ DCHECK(object != nullptr);
+ DCHECK(arg != nullptr);
+ reinterpret_cast<MarkSweep*>(arg)->MarkObjectNonNull(object);
+ return object;
}
void MarkSweep::VerifyRootCallback(const Object* root, void* arg, size_t vreg,