diff options
author | Mathieu Chartier <mathieuc@google.com> | 2014-02-13 18:02:13 -0800 |
---|---|---|
committer | Mathieu Chartier <mathieuc@google.com> | 2014-02-18 10:45:12 -0800 |
commit | 815873ecc312b1d231acce71e1a16f42cdaf09f2 (patch) | |
tree | 18ba2fa951775e60b240271bfe975e6e2cfc654c /runtime/gc/collector/mark_sweep.cc | |
parent | 2befd09cf4fe89a18a655f3e1dd310831bfa769f (diff) | |
download | art-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.cc | 23 |
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, |