It's not an error to reenter InitializeClass.
OsConstants.<clinit> calls a native method that uses JNI to set fields.
This necessarily calls GetStaticFieldID, which entails a call to
ClassLinker::EnsureInitialized.
Change-Id: I8b3e2bdd927fd72c19fbee68f0ba511ad53887c0
diff --git a/src/class_linker.cc b/src/class_linker.cc
index a8281a3..570d797 100644
--- a/src/class_linker.cc
+++ b/src/class_linker.cc
@@ -1179,7 +1179,9 @@
bool ClassLinker::InitializeClass(Class* klass) {
CHECK(klass->GetStatus() == Class::kStatusResolved ||
- klass->GetStatus() == Class::kStatusError) << klass->GetStatus();
+ klass->GetStatus() == Class::kStatusInitializing ||
+ klass->GetStatus() == Class::kStatusError)
+ << PrettyDescriptor(klass->GetDescriptor()) << " is " << klass->GetStatus();
Thread* self = Thread::Current();
@@ -1211,9 +1213,9 @@
}
while (klass->GetStatus() == Class::kStatusInitializing) {
- // we caught somebody else in the act; was it us?
+ // We caught somebody else in the act; was it us?
if (klass->GetClinitThreadId() == self->GetTid()) {
- LG << "recursive <clinit>";
+ // Yes. That's fine.
return true;
}