From 83c8ee000d525017ead8753fce6bc1020249b96a Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Tue, 28 Jan 2014 14:50:23 -0800 Subject: Add root types and thread id to root visiting. Enables us to pass the root type and thread id to hprof. Bug: 12680863 Change-Id: I6a0f1f9e3aa8f9b4033d695818ae7ca3460d67cb --- runtime/runtime.cc | 67 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 35 insertions(+), 32 deletions(-) (limited to 'runtime/runtime.cc') diff --git a/runtime/runtime.cc b/runtime/runtime.cc index 09d05d1..9193be5 100644 --- a/runtime/runtime.cc +++ b/runtime/runtime.cc @@ -375,7 +375,7 @@ static double ParseDoubleOrDie(const std::string& option, char after_char, doubl return value; } -void Runtime::SweepSystemWeaks(RootVisitor* visitor, void* arg) { +void Runtime::SweepSystemWeaks(IsMarkedCallback* visitor, void* arg) { GetInternTable()->SweepInternTableWeaks(visitor, arg); GetMonitorList()->SweepMonitorList(visitor, arg); GetJavaVM()->SweepJniWeakGlobals(visitor, arg); @@ -1301,66 +1301,69 @@ void Runtime::DetachCurrentThread() { return pre_allocated_OutOfMemoryError_; } -void Runtime::VisitConcurrentRoots(RootVisitor* visitor, void* arg, bool only_dirty, +void Runtime::VisitConcurrentRoots(RootCallback* callback, void* arg, bool only_dirty, bool clean_dirty) { - intern_table_->VisitRoots(visitor, arg, only_dirty, clean_dirty); - class_linker_->VisitRoots(visitor, arg, only_dirty, clean_dirty); + intern_table_->VisitRoots(callback, arg, only_dirty, clean_dirty); + class_linker_->VisitRoots(callback, arg, only_dirty, clean_dirty); } -void Runtime::VisitNonThreadRoots(RootVisitor* visitor, void* arg) { +void Runtime::VisitNonThreadRoots(RootCallback* callback, void* arg) { // Visit the classes held as static in mirror classes. - mirror::ArtField::VisitRoots(visitor, arg); - mirror::ArtMethod::VisitRoots(visitor, arg); - mirror::Class::VisitRoots(visitor, arg); - mirror::StackTraceElement::VisitRoots(visitor, arg); - mirror::String::VisitRoots(visitor, arg); - mirror::Throwable::VisitRoots(visitor, arg); + mirror::ArtField::VisitRoots(callback, arg); + mirror::ArtMethod::VisitRoots(callback, arg); + mirror::Class::VisitRoots(callback, arg); + mirror::StackTraceElement::VisitRoots(callback, arg); + mirror::String::VisitRoots(callback, arg); + mirror::Throwable::VisitRoots(callback, arg); // Visit all the primitive array types classes. - mirror::PrimitiveArray::VisitRoots(visitor, arg); // BooleanArray - mirror::PrimitiveArray::VisitRoots(visitor, arg); // ByteArray - mirror::PrimitiveArray::VisitRoots(visitor, arg); // CharArray - mirror::PrimitiveArray::VisitRoots(visitor, arg); // DoubleArray - mirror::PrimitiveArray::VisitRoots(visitor, arg); // FloatArray - mirror::PrimitiveArray::VisitRoots(visitor, arg); // IntArray - mirror::PrimitiveArray::VisitRoots(visitor, arg); // LongArray - mirror::PrimitiveArray::VisitRoots(visitor, arg); // ShortArray - java_vm_->VisitRoots(visitor, arg); + mirror::PrimitiveArray::VisitRoots(callback, arg); // BooleanArray + mirror::PrimitiveArray::VisitRoots(callback, arg); // ByteArray + mirror::PrimitiveArray::VisitRoots(callback, arg); // CharArray + mirror::PrimitiveArray::VisitRoots(callback, arg); // DoubleArray + mirror::PrimitiveArray::VisitRoots(callback, arg); // FloatArray + mirror::PrimitiveArray::VisitRoots(callback, arg); // IntArray + mirror::PrimitiveArray::VisitRoots(callback, arg); // LongArray + mirror::PrimitiveArray::VisitRoots(callback, arg); // ShortArray + java_vm_->VisitRoots(callback, arg); if (pre_allocated_OutOfMemoryError_ != nullptr) { pre_allocated_OutOfMemoryError_ = down_cast( - visitor(pre_allocated_OutOfMemoryError_, arg)); + callback(pre_allocated_OutOfMemoryError_, arg, 0, kRootVMInternal)); DCHECK(pre_allocated_OutOfMemoryError_ != nullptr); } - resolution_method_ = down_cast(visitor(resolution_method_, arg)); + resolution_method_ = down_cast(callback(resolution_method_, arg, 0, + kRootVMInternal)); DCHECK(resolution_method_ != nullptr); if (HasImtConflictMethod()) { - imt_conflict_method_ = down_cast(visitor(imt_conflict_method_, arg)); + imt_conflict_method_ = down_cast(callback(imt_conflict_method_, arg, 0, + kRootVMInternal)); } if (HasDefaultImt()) { - default_imt_ = down_cast*>(visitor(default_imt_, arg)); + default_imt_ = down_cast*>(callback(default_imt_, arg, + 0, kRootVMInternal)); } for (int i = 0; i < Runtime::kLastCalleeSaveType; i++) { if (callee_save_methods_[i] != nullptr) { callee_save_methods_[i] = down_cast( - visitor(callee_save_methods_[i], arg)); + callback(callee_save_methods_[i], arg, 0, kRootVMInternal)); } } { MutexLock mu(Thread::Current(), method_verifiers_lock_); for (verifier::MethodVerifier* verifier : method_verifiers_) { - verifier->VisitRoots(visitor, arg); + verifier->VisitRoots(callback, arg); } } } -void Runtime::VisitNonConcurrentRoots(RootVisitor* visitor, void* arg) { - thread_list_->VisitRoots(visitor, arg); - VisitNonThreadRoots(visitor, arg); +void Runtime::VisitNonConcurrentRoots(RootCallback* callback, void* arg) { + thread_list_->VisitRoots(callback, arg); + VisitNonThreadRoots(callback, arg); } -void Runtime::VisitRoots(RootVisitor* visitor, void* arg, bool only_dirty, bool clean_dirty) { - VisitConcurrentRoots(visitor, arg, only_dirty, clean_dirty); - VisitNonConcurrentRoots(visitor, arg); +void Runtime::VisitRoots(RootCallback* callback, void* arg, bool only_dirty, bool clean_dirty) { + VisitConcurrentRoots(callback, arg, only_dirty, clean_dirty); + VisitNonConcurrentRoots(callback, arg); } mirror::ObjectArray* Runtime::CreateDefaultImt(ClassLinker* cl) { -- cgit v1.1