Switch JNI globals lock to reader-writer.
Also, verifier rejected classes lock. These locks show as contended during
dex2oat, however, they're commonly only read access is required.
Change-Id: If8bb834cc69cd8c26494c87fb7f7b20d4e41cdfd
diff --git a/runtime/jni_internal.cc b/runtime/jni_internal.cc
index ec0c9be..a18a261 100644
--- a/runtime/jni_internal.cc
+++ b/runtime/jni_internal.cc
@@ -91,7 +91,7 @@
}
JavaVMExt* vm = soa.Vm();
IndirectReferenceTable& weak_globals = vm->weak_globals;
- MutexLock mu(soa.Self(), vm->weak_globals_lock);
+ WriterMutexLock mu(soa.Self(), vm->weak_globals_lock);
IndirectRef ref = weak_globals.Add(IRT_FIRST_SEGMENT, obj);
return reinterpret_cast<jweak>(ref);
}
@@ -823,7 +823,7 @@
JavaVMExt* vm = soa.Vm();
IndirectReferenceTable& globals = vm->globals;
Object* decoded_obj = soa.Decode<Object*>(obj);
- MutexLock mu(soa.Self(), vm->globals_lock);
+ WriterMutexLock mu(soa.Self(), vm->globals_lock);
IndirectRef ref = globals.Add(IRT_FIRST_SEGMENT, decoded_obj);
return reinterpret_cast<jobject>(ref);
}
@@ -835,7 +835,7 @@
JavaVMExt* vm = reinterpret_cast<JNIEnvExt*>(env)->vm;
IndirectReferenceTable& globals = vm->globals;
Thread* self = reinterpret_cast<JNIEnvExt*>(env)->self;
- MutexLock mu(self, vm->globals_lock);
+ WriterMutexLock mu(self, vm->globals_lock);
if (!globals.Remove(IRT_FIRST_SEGMENT, obj)) {
LOG(WARNING) << "JNI WARNING: DeleteGlobalRef(" << obj << ") "
@@ -855,7 +855,7 @@
ScopedObjectAccess soa(env);
JavaVMExt* vm = soa.Vm();
IndirectReferenceTable& weak_globals = vm->weak_globals;
- MutexLock mu(soa.Self(), vm->weak_globals_lock);
+ WriterMutexLock mu(soa.Self(), vm->weak_globals_lock);
if (!weak_globals.Remove(IRT_FIRST_SEGMENT, obj)) {
LOG(WARNING) << "JNI WARNING: DeleteWeakGlobalRef(" << obj << ") "
@@ -3019,11 +3019,11 @@
os << "; pins=" << pin_table.Size();
}
{
- MutexLock mu(self, globals_lock);
+ ReaderMutexLock mu(self, globals_lock);
os << "; globals=" << globals.Capacity();
}
{
- MutexLock mu(self, weak_globals_lock);
+ ReaderMutexLock mu(self, weak_globals_lock);
if (weak_globals.Capacity() > 0) {
os << " (plus " << weak_globals.Capacity() << " weak)";
}
@@ -3039,11 +3039,11 @@
void JavaVMExt::DumpReferenceTables(std::ostream& os) {
Thread* self = Thread::Current();
{
- MutexLock mu(self, globals_lock);
+ ReaderMutexLock mu(self, globals_lock);
globals.Dump(os);
}
{
- MutexLock mu(self, weak_globals_lock);
+ ReaderMutexLock mu(self, weak_globals_lock);
weak_globals.Dump(os);
}
{
@@ -3191,7 +3191,7 @@
return NULL;
}
} else {
- CHECK(c->GetStatus() >= Class::kStatusInitializing) << c->GetStatus() << " " << PrettyMethod(m);
+ CHECK(c->IsInitializing()) << c->GetStatus() << " " << PrettyMethod(m);
}
std::string detail;
@@ -3212,7 +3212,7 @@
void JavaVMExt::VisitRoots(RootVisitor* visitor, void* arg) {
Thread* self = Thread::Current();
{
- MutexLock mu(self, globals_lock);
+ ReaderMutexLock mu(self, globals_lock);
globals.VisitRoots(visitor, arg);
}
{