diff options
author | Mathieu Chartier <mathieuc@google.com> | 2015-03-31 12:05:24 -0700 |
---|---|---|
committer | Mathieu Chartier <mathieuc@google.com> | 2015-03-31 15:57:27 -0700 |
commit | 461687d898dfd91253f242072849a9fe43e5f523 (patch) | |
tree | 452e3e11cb5746f487920f87fcaf1b238d2a8957 | |
parent | e33d0cb5b88703302e3912ca96dabcb06fea4340 (diff) | |
download | android_art-461687d898dfd91253f242072849a9fe43e5f523.tar.gz android_art-461687d898dfd91253f242072849a9fe43e5f523.tar.bz2 android_art-461687d898dfd91253f242072849a9fe43e5f523.zip |
Visit image roots for hprof
Bug: 19995360
(cherry picked from commit 0cab5e68f14ee403380664146db6dc7ddfc32064)
Change-Id: I17868bff2a701dc25291d41b9732c6b86f92be08
-rw-r--r-- | runtime/hprof/hprof.cc | 1 | ||||
-rw-r--r-- | runtime/runtime.cc | 19 | ||||
-rw-r--r-- | runtime/runtime.h | 4 |
3 files changed, 23 insertions, 1 deletions
diff --git a/runtime/hprof/hprof.cc b/runtime/hprof/hprof.cc index b822613575..656569cb66 100644 --- a/runtime/hprof/hprof.cc +++ b/runtime/hprof/hprof.cc @@ -507,6 +507,7 @@ class Hprof { Env env = { this, output }; runtime->VisitRoots(RootVisitor, &env); + runtime->VisitImageRoots(RootVisitor, &env); runtime->GetHeap()->VisitObjectsPaused(VisitObjectCallback, &env); output->StartNewRecord(HPROF_TAG_HEAP_DUMP_END, kHprofTime); diff --git a/runtime/runtime.cc b/runtime/runtime.cc index 23a7db614c..b5d2e153bc 100644 --- a/runtime/runtime.cc +++ b/runtime/runtime.cc @@ -62,7 +62,7 @@ #include "gc/accounting/card_table-inl.h" #include "gc/heap.h" #include "gc/space/image_space.h" -#include "gc/space/space.h" +#include "gc/space/space-inl.h" #include "handle_scope-inl.h" #include "image.h" #include "instrumentation.h" @@ -1355,6 +1355,23 @@ void Runtime::VisitRoots(RootCallback* callback, void* arg, VisitRootFlags flags VisitConcurrentRoots(callback, arg, flags); } +void Runtime::VisitImageRoots(RootCallback* callback, void* arg) { + for (auto* space : GetHeap()->GetContinuousSpaces()) { + if (space->IsImageSpace()) { + auto* image_space = space->AsImageSpace(); + const auto& image_header = image_space->GetImageHeader(); + for (size_t i = 0; i < ImageHeader::kImageRootsMax; ++i) { + auto* obj = image_header.GetImageRoot(static_cast<ImageHeader::ImageRoot>(i)); + if (obj != nullptr) { + auto* after_obj = obj; + callback(&after_obj, arg, RootInfo(kRootStickyClass)); + CHECK_EQ(after_obj, obj); + } + } + } + } +} + mirror::ObjectArray<mirror::ArtMethod>* Runtime::CreateDefaultImt(ClassLinker* cl) { Thread* self = Thread::Current(); StackHandleScope<1> hs(self); diff --git a/runtime/runtime.h b/runtime/runtime.h index 085335fd3c..64b7183247 100644 --- a/runtime/runtime.h +++ b/runtime/runtime.h @@ -298,6 +298,10 @@ class Runtime { void VisitRoots(RootCallback* visitor, void* arg, VisitRootFlags flags = kVisitRootFlagAllRoots) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + // Visit image roots, only used for hprof since the GC uses the image space mod union table + // instead. + void VisitImageRoots(RootCallback* visitor, void* arg) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + // Visit all of the roots we can do safely do concurrently. void VisitConcurrentRoots(RootCallback* visitor, void* arg, VisitRootFlags flags = kVisitRootFlagAllRoots) |