< prev index next >
src/hotspot/share/oops/instanceKlass.cpp
Print this page
@@ -684,19 +684,10 @@
bool InstanceKlass::verify_code(TRAPS) {
// 1) Verify the bytecodes
return Verifier::verify(this, should_verify_class(), THREAD);
}
-
-// Used exclusively by the shared spaces dump mechanism to prevent
-// classes mapped into the shared regions in new VMs from appearing linked.
-
-void InstanceKlass::unlink_class() {
- assert(is_linked(), "must be linked");
- _init_state = loaded;
-}
-
void InstanceKlass::link_class(TRAPS) {
assert(is_loaded(), "must be loaded");
if (!is_linked()) {
link_class_impl(CHECK);
}
@@ -2298,14 +2289,16 @@
// is_linked() is true.
// If there's a linking error, there is nothing else to remove.
return;
}
- // Unlink the class
- if (is_linked()) {
- unlink_class();
- }
+ // Reset to the 'allocated' state to prevent any premature accessing to
+ // a shared class at runtime while the class is still being loaded and
+ // restored. A class' init_state is set to 'loaded' at runtime when it's
+ // being added to class hierarchy (see SystemDictionary:::add_to_hierarchy()).
+ _init_state = allocated;
+
{
MutexLocker ml(Compile_lock);
init_implementor();
}
@@ -2348,10 +2341,14 @@
array_klasses()->remove_java_mirror();
}
}
void InstanceKlass::restore_unshareable_info(ClassLoaderData* loader_data, Handle protection_domain, TRAPS) {
+ // SystemDictionary::add_to_hierarchy() sets the init_state to loaded
+ // before the InstanceKlass is added to the SystemDictionary. Make
+ // sure the current state is <loaded.
+ assert(!is_loaded(), "invalid init state");
set_package(loader_data, CHECK);
Klass::restore_unshareable_info(loader_data, protection_domain, CHECK);
Array<Method*>* methods = this->methods();
int num_methods = methods->length();
< prev index next >