summaryrefslogtreecommitdiff
path: root/runtime/class_linker.cc
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2021-08-12 12:03:24 -0700
committerXin Li <delphij@google.com>2021-08-12 22:47:56 +0000
commit54fd5f77b87649f8ab9b6699e064386fdceaecec (patch)
treeb27b01463388755905959e32acc9072ac333e7c0 /runtime/class_linker.cc
parent029a811dcb18e54d54aca805db7f8af452798a0a (diff)
parent7b4fead5e9441eeb9ff5a9336d500b49ffae8d97 (diff)
Merge ab/7633965
Bug: 169893837 Merged-In: Icb57ed5eb6b8976ecf6ac88bf8c278bbe144b450 Change-Id: I42ed1234422b6af296254d93055f9e3a69441c6c
Diffstat (limited to 'runtime/class_linker.cc')
-rw-r--r--runtime/class_linker.cc20
1 files changed, 14 insertions, 6 deletions
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index 5f4f0abf8f..b9751ab965 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -5049,7 +5049,9 @@ ObjPtr<mirror::Class> ClassLinker::CreateProxyClass(ScopedObjectAccessAlreadyRun
Handle<mirror::ObjectArray<mirror::Class>> h_interfaces(
hs.NewHandle(soa.Decode<mirror::ObjectArray<mirror::Class>>(interfaces)));
if (!LinkClass(self, descriptor, temp_klass, h_interfaces, &klass)) {
- mirror::Class::SetStatus(temp_klass, ClassStatus::kErrorUnresolved, self);
+ if (!temp_klass->IsErroneous()) {
+ mirror::Class::SetStatus(temp_klass, ClassStatus::kErrorUnresolved, self);
+ }
return nullptr;
}
}
@@ -9812,16 +9814,22 @@ void ClassLinker::SetEntryPointsForObsoleteMethod(ArtMethod* method) const {
}
void ClassLinker::DumpForSigQuit(std::ostream& os) {
- ScopedObjectAccess soa(Thread::Current());
- ReaderMutexLock mu(soa.Self(), *Locks::classlinker_classes_lock_);
+ // Avoid a deadlock between a garbage collecting thread running a checkpoint,
+ // a thread holding the dex or classlinker lock and blocking on a condition variable for
+ // weak references access, and a thread blocking on the dex or classlinker lock and thus
+ // unable to run the checkpoint.
+ Thread* self = Thread::Current();
+ ScopedObjectAccess soa(self);
+ gc::ScopedGCCriticalSection gcs(self, gc::kGcCauseClassLinker, gc::kCollectorTypeClassLinker);
+ ReaderMutexLock mu(self, *Locks::classlinker_classes_lock_);
os << "Zygote loaded classes=" << NumZygoteClasses() << " post zygote classes="
<< NumNonZygoteClasses() << "\n";
- ReaderMutexLock mu2(soa.Self(), *Locks::dex_lock_);
+ ReaderMutexLock mu2(self, *Locks::dex_lock_);
os << "Dumping registered class loaders\n";
size_t class_loader_index = 0;
for (const ClassLoaderData& class_loader : class_loaders_) {
ObjPtr<mirror::ClassLoader> loader =
- ObjPtr<mirror::ClassLoader>::DownCast(soa.Self()->DecodeJObject(class_loader.weak_root));
+ ObjPtr<mirror::ClassLoader>::DownCast(self->DecodeJObject(class_loader.weak_root));
if (loader != nullptr) {
os << "#" << class_loader_index++ << " " << loader->GetClass()->PrettyDescriptor() << ": [";
bool saw_one_dex_file = false;
@@ -9840,7 +9848,7 @@ void ClassLinker::DumpForSigQuit(std::ostream& os) {
size_t parent_index = 0;
for (const ClassLoaderData& class_loader2 : class_loaders_) {
ObjPtr<mirror::ClassLoader> loader2 = ObjPtr<mirror::ClassLoader>::DownCast(
- soa.Self()->DecodeJObject(class_loader2.weak_root));
+ self->DecodeJObject(class_loader2.weak_root));
if (loader2 == loader->GetParent()) {
os << ", parent #" << parent_index;
found_parent = true;