< prev index next >
src/hotspot/share/classfile/packageEntry.cpp
Print this page
*** 123,133 ****
// Remove dead module entries within the package's exported list. Note that
// if all of the modules on the _qualified_exports get purged the list does not
// get deleted. This prevents the package from illegally transitioning from
// exported to non-exported.
void PackageEntry::purge_qualified_exports() {
! assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
if (_must_walk_exports &&
_qualified_exports != NULL &&
!_qualified_exports->is_empty()) {
ModuleEntry* pkg_module = module();
--- 123,133 ----
// Remove dead module entries within the package's exported list. Note that
// if all of the modules on the _qualified_exports get purged the list does not
// get deleted. This prevents the package from illegally transitioning from
// exported to non-exported.
void PackageEntry::purge_qualified_exports() {
! assert_locked_or_safepoint(Module_lock);
if (_must_walk_exports &&
_qualified_exports != NULL &&
!_qualified_exports->is_empty()) {
ModuleEntry* pkg_module = module();
*** 158,168 ****
}
}
}
void PackageEntry::delete_qualified_exports() {
- assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
if (_qualified_exports != NULL) {
delete _qualified_exports;
}
_qualified_exports = NULL;
}
--- 158,167 ----
*** 226,258 ****
return entry;
}
}
PackageEntry* PackageEntryTable::lookup(Symbol* name, ModuleEntry* module) {
PackageEntry* p = lookup_only(name);
if (p != NULL) {
return p;
} else {
- // If not found, add to table. Grab the PackageEntryTable lock first.
- MutexLocker ml(Module_lock);
-
- // Since look-up was done lock-free, we need to check if another thread beat
- // us in the race to insert the package.
- PackageEntry* test = lookup_only(name);
- if (test != NULL) {
- // A race occurred and another thread introduced the package.
- return test;
- } else {
assert(module != NULL, "module should never be null");
PackageEntry* entry = new_entry(compute_hash(name), name, module);
add_entry(index_for(name), entry);
return entry;
}
- }
}
PackageEntry* PackageEntryTable::lookup_only(Symbol* name) {
int index = index_for(name);
for (PackageEntry* p = bucket(index); p != NULL; p = p->next()) {
if (p->name()->fast_compare(name) == 0) {
return p;
}
--- 225,248 ----
return entry;
}
}
PackageEntry* PackageEntryTable::lookup(Symbol* name, ModuleEntry* module) {
+ MutexLocker ml(Module_lock);
PackageEntry* p = lookup_only(name);
if (p != NULL) {
return p;
} else {
assert(module != NULL, "module should never be null");
PackageEntry* entry = new_entry(compute_hash(name), name, module);
add_entry(index_for(name), entry);
return entry;
}
}
PackageEntry* PackageEntryTable::lookup_only(Symbol* name) {
+ MutexLockerEx ml(Module_lock->owned_by_self() ? NULL : Module_lock);
int index = index_for(name);
for (PackageEntry* p = bucket(index); p != NULL; p = p->next()) {
if (p->name()->fast_compare(name) == 0) {
return p;
}
*** 294,304 ****
}
}
}
bool PackageEntry::exported_pending_delete() const {
! assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
return (is_unqual_exported() && _qualified_exports != NULL);
}
// Remove dead entries from all packages' exported list
void PackageEntryTable::purge_all_package_exports() {
--- 284,294 ----
}
}
}
bool PackageEntry::exported_pending_delete() const {
! assert_locked_or_safepoint(Module_lock);
return (is_unqual_exported() && _qualified_exports != NULL);
}
// Remove dead entries from all packages' exported list
void PackageEntryTable::purge_all_package_exports() {
< prev index next >