< 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 >