From 461687d898dfd91253f242072849a9fe43e5f523 Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Tue, 31 Mar 2015 12:05:24 -0700 Subject: Visit image roots for hprof Bug: 19995360 (cherry picked from commit 0cab5e68f14ee403380664146db6dc7ddfc32064) Change-Id: I17868bff2a701dc25291d41b9732c6b86f92be08 --- runtime/hprof/hprof.cc | 1 + runtime/runtime.cc | 19 ++++++++++++++++++- runtime/runtime.h | 4 ++++ 3 files changed, 23 insertions(+), 1 deletion(-) 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(i)); + if (obj != nullptr) { + auto* after_obj = obj; + callback(&after_obj, arg, RootInfo(kRootStickyClass)); + CHECK_EQ(after_obj, obj); + } + } + } + } +} + mirror::ObjectArray* 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) -- cgit v1.2.3