8209541: Fix merge problem in SymbolTable::do_check_concurrent_work

Remerged with previous change to do_unloading.

Reviewed-by: hseigel
This commit is contained in:
Coleen Phillimore 2018-08-15 16:01:48 -04:00
parent 68e65d8ece
commit ef15adee70
2 changed files with 12 additions and 25 deletions
src/hotspot/share/classfile

@ -1418,28 +1418,6 @@ bool ClassLoaderDataGraph::do_unloading(bool do_cleaning) {
}
if (seen_dead_loader) {
data = _head;
while (data != NULL) {
// Remove entries in the dictionary of live class loader that have
// initiated loading classes in a dead class loader.
if (data->dictionary() != NULL) {
data->dictionary()->do_unloading();
}
// Walk a ModuleEntry's reads, and a PackageEntry's exports
// lists to determine if there are modules on those lists that are now
// dead and should be removed. A module's life cycle is equivalent
// to its defining class loader's life cycle. Since a module is
// considered dead if its class loader is dead, these walks must
// occur after each class loader's aliveness is determined.
if (data->packages() != NULL) {
data->packages()->purge_all_package_exports();
}
if (data->modules_defined()) {
data->modules()->purge_all_module_reads();
}
data = data->next();
}
SymbolTable::do_check_concurrent_work();
JFR_ONLY(post_class_unload_events();)
}

@ -1858,10 +1858,19 @@ bool SystemDictionary::do_unloading(GCTimer* gc_timer,
}
}
// TODO: just return if !unloading_occurred.
if (unloading_occurred) {
GCTraceTime(Debug, gc, phases) t("Dictionary", gc_timer);
constraints()->purge_loader_constraints();
resolution_errors()->purge_resolution_errors();
{
GCTraceTime(Debug, gc, phases) t("SymbolTable", gc_timer);
// Check if there's work to do in the SymbolTable
SymbolTable::do_check_concurrent_work();
}
{
GCTraceTime(Debug, gc, phases) t("Dictionary", gc_timer);
constraints()->purge_loader_constraints();
resolution_errors()->purge_resolution_errors();
}
}
{