diff options
Diffstat (limited to 'runtime/gc')
-rw-r--r-- | runtime/gc/collector/mark_compact.cc | 10 | ||||
-rw-r--r-- | runtime/gc/collector/mark_compact.h | 7 | ||||
-rw-r--r-- | runtime/gc/collector/mark_sweep.cc | 25 | ||||
-rw-r--r-- | runtime/gc/collector/mark_sweep.h | 16 | ||||
-rw-r--r-- | runtime/gc/collector/semi_space.cc | 3 | ||||
-rw-r--r-- | runtime/gc/collector/semi_space.h | 4 | ||||
-rw-r--r-- | runtime/gc/heap.cc | 10 |
7 files changed, 30 insertions, 45 deletions
diff --git a/runtime/gc/collector/mark_compact.cc b/runtime/gc/collector/mark_compact.cc index b2482ac..18af005 100644 --- a/runtime/gc/collector/mark_compact.cc +++ b/runtime/gc/collector/mark_compact.cc @@ -300,22 +300,20 @@ mirror::Object* MarkCompact::MarkObjectCallback(mirror::Object* root, void* arg) } void MarkCompact::MarkHeapReferenceCallback(mirror::HeapReference<mirror::Object>* obj_ptr, - void* arg) { + void* arg) { reinterpret_cast<MarkCompact*>(arg)->MarkObject(obj_ptr->AsMirrorPtr()); } void MarkCompact::DelayReferenceReferentCallback(mirror::Class* klass, mirror::Reference* ref, - void* arg) { + void* arg) { reinterpret_cast<MarkCompact*>(arg)->DelayReferenceReferent(klass, ref); } -void MarkCompact::MarkRootCallback(Object** root, void* arg, uint32_t /*thread_id*/, - RootType /*root_type*/) { +void MarkCompact::MarkRootCallback(Object** root, void* arg, const RootInfo& /*root_info*/) { reinterpret_cast<MarkCompact*>(arg)->MarkObject(*root); } -void MarkCompact::UpdateRootCallback(Object** root, void* arg, uint32_t /*thread_id*/, - RootType /*root_type*/) { +void MarkCompact::UpdateRootCallback(Object** root, void* arg, const RootInfo& /*root_info*/) { mirror::Object* obj = *root; mirror::Object* new_obj = reinterpret_cast<MarkCompact*>(arg)->GetMarkedForwardAddress(obj); if (obj != new_obj) { diff --git a/runtime/gc/collector/mark_compact.h b/runtime/gc/collector/mark_compact.h index f40e870..f6d473d 100644 --- a/runtime/gc/collector/mark_compact.h +++ b/runtime/gc/collector/mark_compact.h @@ -24,6 +24,7 @@ #include "base/macros.h" #include "base/mutex.h" #include "garbage_collector.h" +#include "gc_root.h" #include "gc/accounting/heap_bitmap.h" #include "immune_region.h" #include "lock_word.h" @@ -113,8 +114,7 @@ class MarkCompact : public GarbageCollector { void SweepSystemWeaks() SHARED_LOCKS_REQUIRED(Locks::heap_bitmap_lock_, Locks::mutator_lock_); - static void MarkRootCallback(mirror::Object** root, void* arg, uint32_t /*tid*/, - RootType /*root_type*/) + static void MarkRootCallback(mirror::Object** root, void* arg, const RootInfo& root_info) EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_, Locks::mutator_lock_); static mirror::Object* MarkObjectCallback(mirror::Object* root, void* arg) @@ -180,8 +180,7 @@ class MarkCompact : public GarbageCollector { EXCLUSIVE_LOCKS_REQUIRED(Locks::mutator_lock_, Locks::heap_bitmap_lock_); // Update the references of objects by using the forwarding addresses. void UpdateReferences() EXCLUSIVE_LOCKS_REQUIRED(Locks::mutator_lock_, Locks::heap_bitmap_lock_); - static void UpdateRootCallback(mirror::Object** root, void* arg, uint32_t /*thread_id*/, - RootType /*root_type*/) + static void UpdateRootCallback(mirror::Object** root, void* arg, const RootInfo& /*root_info*/) EXCLUSIVE_LOCKS_REQUIRED(Locks::mutator_lock_) SHARED_LOCKS_REQUIRED(Locks::heap_bitmap_lock_); // Move objects and restore lock words. diff --git a/runtime/gc/collector/mark_sweep.cc b/runtime/gc/collector/mark_sweep.cc index 6ad44e6..80f7968 100644 --- a/runtime/gc/collector/mark_sweep.cc +++ b/runtime/gc/collector/mark_sweep.cc @@ -460,42 +460,35 @@ inline void MarkSweep::MarkObject(Object* obj) { } } -void MarkSweep::MarkRootParallelCallback(Object** root, void* arg, uint32_t /*thread_id*/, - RootType /*root_type*/) { +void MarkSweep::MarkRootParallelCallback(Object** root, void* arg, const RootInfo& /*root_info*/) { reinterpret_cast<MarkSweep*>(arg)->MarkObjectNonNullParallel(*root); } -void MarkSweep::VerifyRootMarked(Object** root, void* arg, uint32_t /*thread_id*/, - RootType /*root_type*/) { +void MarkSweep::VerifyRootMarked(Object** root, void* arg, const RootInfo& /*root_info*/) { CHECK(reinterpret_cast<MarkSweep*>(arg)->IsMarked(*root)); } -void MarkSweep::MarkRootCallback(Object** root, void* arg, uint32_t /*thread_id*/, - RootType /*root_type*/) { +void MarkSweep::MarkRootCallback(Object** root, void* arg, const RootInfo& /*root_info*/) { reinterpret_cast<MarkSweep*>(arg)->MarkObjectNonNull(*root); } -void MarkSweep::VerifyRootCallback(const Object* root, void* arg, size_t vreg, - const StackVisitor* visitor, RootType root_type) { - reinterpret_cast<MarkSweep*>(arg)->VerifyRoot(root, vreg, visitor, root_type); +void MarkSweep::VerifyRootCallback(Object** root, void* arg, const RootInfo& root_info) { + reinterpret_cast<MarkSweep*>(arg)->VerifyRoot(*root, root_info); } -void MarkSweep::VerifyRoot(const Object* root, size_t vreg, const StackVisitor* visitor, - RootType root_type) { +void MarkSweep::VerifyRoot(const Object* root, const RootInfo& root_info) { // See if the root is on any space bitmap. if (heap_->GetLiveBitmap()->GetContinuousSpaceBitmap(root) == nullptr) { space::LargeObjectSpace* large_object_space = GetHeap()->GetLargeObjectsSpace(); if (large_object_space != nullptr && !large_object_space->Contains(root)) { - LOG(ERROR) << "Found invalid root: " << root << " with type " << root_type; - if (visitor != NULL) { - LOG(ERROR) << visitor->DescribeLocation() << " in VReg: " << vreg; - } + LOG(ERROR) << "Found invalid root: " << root << " "; + root_info.Describe(LOG(ERROR)); } } } void MarkSweep::VerifyRoots() { - Runtime::Current()->GetThreadList()->VerifyRoots(VerifyRootCallback, this); + Runtime::Current()->GetThreadList()->VisitRoots(VerifyRootCallback, this); } void MarkSweep::MarkRoots(Thread* self) { diff --git a/runtime/gc/collector/mark_sweep.h b/runtime/gc/collector/mark_sweep.h index 9ac110d..b787327 100644 --- a/runtime/gc/collector/mark_sweep.h +++ b/runtime/gc/collector/mark_sweep.h @@ -24,6 +24,7 @@ #include "base/macros.h" #include "base/mutex.h" #include "garbage_collector.h" +#include "gc_root.h" #include "gc/accounting/heap_bitmap.h" #include "immune_region.h" #include "object_callbacks.h" @@ -182,13 +183,11 @@ class MarkSweep : public GarbageCollector { SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_); - static void MarkRootCallback(mirror::Object** root, void* arg, uint32_t thread_id, - RootType root_type) + static void MarkRootCallback(mirror::Object** root, void* arg, const RootInfo& root_info) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_); - static void VerifyRootMarked(mirror::Object** root, void* arg, uint32_t /*thread_id*/, - RootType /*root_type*/) + static void VerifyRootMarked(mirror::Object** root, void* arg, const RootInfo& root_info) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_); @@ -196,8 +195,7 @@ class MarkSweep : public GarbageCollector { EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - static void MarkRootParallelCallback(mirror::Object** root, void* arg, uint32_t thread_id, - RootType root_type) + static void MarkRootParallelCallback(mirror::Object** root, void* arg, const RootInfo& root_info) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); // Marks an object. @@ -247,11 +245,9 @@ class MarkSweep : public GarbageCollector { // whether or not we care about pauses. size_t GetThreadCount(bool paused) const; - static void VerifyRootCallback(const mirror::Object* root, void* arg, size_t vreg, - const StackVisitor *visitor, RootType root_type); + static void VerifyRootCallback(mirror::Object** root, void* arg, const RootInfo& root_info); - void VerifyRoot(const mirror::Object* root, size_t vreg, const StackVisitor* visitor, - RootType root_type) NO_THREAD_SAFETY_ANALYSIS; + void VerifyRoot(const mirror::Object* root, const RootInfo& root_info) NO_THREAD_SAFETY_ANALYSIS; // Push a single reference on a mark stack. void PushOnMarkStack(mirror::Object* obj); diff --git a/runtime/gc/collector/semi_space.cc b/runtime/gc/collector/semi_space.cc index 82d6992..fcc601f 100644 --- a/runtime/gc/collector/semi_space.cc +++ b/runtime/gc/collector/semi_space.cc @@ -600,8 +600,7 @@ void SemiSpace::DelayReferenceReferentCallback(mirror::Class* klass, mirror::Ref reinterpret_cast<SemiSpace*>(arg)->DelayReferenceReferent(klass, ref); } -void SemiSpace::MarkRootCallback(Object** root, void* arg, uint32_t /*thread_id*/, - RootType /*root_type*/) { +void SemiSpace::MarkRootCallback(Object** root, void* arg, const RootInfo& /*root_info*/) { auto ref = StackReference<mirror::Object>::FromMirrorPtr(*root); reinterpret_cast<SemiSpace*>(arg)->MarkObject(&ref); if (*root != ref.AsMirrorPtr()) { diff --git a/runtime/gc/collector/semi_space.h b/runtime/gc/collector/semi_space.h index 1c4f1e4..f8fced8 100644 --- a/runtime/gc/collector/semi_space.h +++ b/runtime/gc/collector/semi_space.h @@ -23,6 +23,7 @@ #include "base/macros.h" #include "base/mutex.h" #include "garbage_collector.h" +#include "gc_root.h" #include "gc/accounting/heap_bitmap.h" #include "immune_region.h" #include "mirror/object_reference.h" @@ -132,8 +133,7 @@ class SemiSpace : public GarbageCollector { void SweepSystemWeaks() SHARED_LOCKS_REQUIRED(Locks::heap_bitmap_lock_, Locks::mutator_lock_); - static void MarkRootCallback(mirror::Object** root, void* arg, uint32_t /*tid*/, - RootType /*root_type*/) + static void MarkRootCallback(mirror::Object** root, void* arg, const RootInfo& root_info) EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_, Locks::mutator_lock_); static mirror::Object* MarkObjectCallback(mirror::Object* root, void* arg) diff --git a/runtime/gc/heap.cc b/runtime/gc/heap.cc index 618f1cc..553a5d3 100644 --- a/runtime/gc/heap.cc +++ b/runtime/gc/heap.cc @@ -2236,8 +2236,8 @@ void Heap::FinishGC(Thread* self, collector::GcType gc_type) { gc_complete_cond_->Broadcast(self); } -static void RootMatchesObjectVisitor(mirror::Object** root, void* arg, uint32_t /*thread_id*/, - RootType /*root_type*/) { +static void RootMatchesObjectVisitor(mirror::Object** root, void* arg, + const RootInfo& /*root_info*/) { mirror::Object* obj = reinterpret_cast<mirror::Object*>(arg); if (*root == obj) { LOG(INFO) << "Object " << obj << " is a root"; @@ -2279,12 +2279,12 @@ class VerifyReferenceVisitor { return heap_->IsLiveObjectLocked(obj, true, false, true); } - static void VerifyRootCallback(mirror::Object** root, void* arg, uint32_t thread_id, - RootType root_type) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { + static void VerifyRootCallback(mirror::Object** root, void* arg, const RootInfo& root_info) + SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { VerifyReferenceVisitor* visitor = reinterpret_cast<VerifyReferenceVisitor*>(arg); if (!visitor->VerifyReference(nullptr, *root, MemberOffset(0))) { LOG(ERROR) << "Root " << *root << " is dead with type " << PrettyTypeOf(*root) - << " thread_id= " << thread_id << " root_type= " << root_type; + << " thread_id= " << root_info.GetThreadId() << " root_type= " << root_info.GetType(); } } |