mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 07:14:30 +02:00
8028497: SIGSEGV at ClassLoaderData::oops_do(OopClosure*, KlassClosure*, bool)
Keep class in CLD::_klasses list and mirror created for CDS classes if OOM during restore_shareable_info(). This keeps pointers consistent for CMS. Reviewed-by: ehelin, stefank, jmasa, iklam
This commit is contained in:
parent
eea84b4feb
commit
c8990959f2
14 changed files with 109 additions and 139 deletions
|
@ -826,47 +826,6 @@ Klass* SystemDictionary::resolve_instance_class_or_null(Symbol* name,
|
|||
}
|
||||
} // load_instance_class loop
|
||||
|
||||
if (HAS_PENDING_EXCEPTION) {
|
||||
// An exception, such as OOM could have happened at various places inside
|
||||
// load_instance_class. We might have partially initialized a shared class
|
||||
// and need to clean it up.
|
||||
if (class_loader.is_null()) {
|
||||
// In some cases k may be null. Let's find the shared class again.
|
||||
instanceKlassHandle ik(THREAD, find_shared_class(name));
|
||||
if (ik.not_null()) {
|
||||
if (ik->class_loader_data() == NULL) {
|
||||
// We didn't go as far as Klass::restore_unshareable_info(),
|
||||
// so nothing to clean up.
|
||||
} else {
|
||||
Klass *kk;
|
||||
{
|
||||
MutexLocker mu(SystemDictionary_lock, THREAD);
|
||||
kk = find_class(d_index, d_hash, name, ik->class_loader_data());
|
||||
}
|
||||
if (kk != NULL) {
|
||||
// No clean up is needed if the shared class has been entered
|
||||
// into system dictionary, as load_shared_class() won't be called
|
||||
// again.
|
||||
} else {
|
||||
// This must be done outside of the SystemDictionary_lock to
|
||||
// avoid deadlock.
|
||||
//
|
||||
// Note that Klass::restore_unshareable_info (called via
|
||||
// load_instance_class above) is also called outside
|
||||
// of SystemDictionary_lock. Other threads are blocked from
|
||||
// loading this class because they are waiting on the
|
||||
// SystemDictionary_lock until this thread removes
|
||||
// the placeholder below.
|
||||
//
|
||||
// This need to be re-thought when parallel-capable non-boot
|
||||
// classloaders are supported by CDS (today they're not).
|
||||
clean_up_shared_class(ik, class_loader, THREAD);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (load_instance_added == true) {
|
||||
// clean up placeholder entries for LOAD_INSTANCE success or error
|
||||
// This brackets the SystemDictionary updates for both defining
|
||||
|
@ -1272,19 +1231,6 @@ instanceKlassHandle SystemDictionary::load_shared_class(
|
|||
return ik;
|
||||
}
|
||||
|
||||
void SystemDictionary::clean_up_shared_class(instanceKlassHandle ik, Handle class_loader, TRAPS) {
|
||||
// Updating methods must be done under a lock so multiple
|
||||
// threads don't update these in parallel
|
||||
// Shared classes are all currently loaded by the bootstrap
|
||||
// classloader, so this will never cause a deadlock on
|
||||
// a custom class loader lock.
|
||||
{
|
||||
Handle lockObject = compute_loader_lock_object(class_loader, THREAD);
|
||||
check_loader_lock_contention(lockObject, THREAD);
|
||||
ObjectLocker ol(lockObject, THREAD, true);
|
||||
ik->remove_unshareable_info();
|
||||
}
|
||||
}
|
||||
|
||||
instanceKlassHandle SystemDictionary::load_instance_class(Symbol* class_name, Handle class_loader, TRAPS) {
|
||||
instanceKlassHandle nh = instanceKlassHandle(); // null Handle
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue