From 0cab5e68f14ee403380664146db6dc7ddfc32064 Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Tue, 31 Mar 2015 12:05:24 -0700 Subject: [PATCH] Visit image roots for hprof Bug: 19995360 Change-Id: I1f2989c8bccf508b1d47dfd0d7aee4c7bb275b56 --- 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 b82261357..656569cb6 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 23a7db614..b5d2e153b 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 085335fd3..64b718324 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) -- 2.11.0