RFR 8170870: https://bugs.openjdk.java.net/browse/JDK-8170870

serguei.spitsyn at oracle.com serguei.spitsyn at oracle.com
Thu Dec 8 10:04:17 UTC 2016


Hi Harold,

I have a couple of comments so far.

http://cr.openjdk.java.net/~hseigel/bug_8170870/webrev/src/share/vm/classfile/packageEntry.cpp.udiff.html

  void PackageEntry::package_exports_do(ModuleClosure* const f) {
- assert_locked_or_safepoint(Module_lock);
    assert(f != NULL, "invariant");
-
+ assert(Module_lock->owned_by_self(), "should have the Module_lock");


The function is used here:
   closed/share/vm/jfr/jfrModules.cpp: 
package->package_exports_do(&qexports);

static void module_export_event_callback(PackageEntry*const package) {
   assert_locked_or_safepoint(Module_lock);
   assert(package != NULL,"invariant");

   if (package->is_exported()) {
     if (package->has_qual_exports_list()) {
       . . .
       package->package_exports_do(&qexports);
       return;
     }


It seems, the module_export_event_callback() is the only context where 
the package_exports_do is called.
But that context has the assert:
assert_locked_or_safepoint(Module_lock);


It means that it can be at a safepoint with the unlocked Module_lock.
In such a case, the new assert in the package_exports_do() would fire.
(I do not see that your closed webrev updates the 
closed/share/vm/jfr/jfrModules.cpp).


And one question:

  void PackageEntryTable::purge_all_package_exports() {
    assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
+ if (table_size() > 0) {
+ MutexLocker module_lock(Module_lock);


The purge_all_package_exports() is called at a safepoint and it holds 
the Module_lock.
This is probably Ok because the critical section does not escape the 
safepoint
and also no thread is allowed to hold the Module_lock over a safepoint.
Could you confirm that my understanding is correct here?


Thanks,
Serguei


On 12/7/16 10:43, harold seigel wrote:
> Hi,
>
> Please review this fix for bug JDK-8170870.  The fix synchronizes 
> access to the class loaders' PackageEntryTable and ModuleEntryTable 
> structures by requiring callers of ClassLoaderData::modules_do() and 
> ClassLoaderData::packages_do() to lock the Module_lock.
>
> The lock is needed because even during a safepoint one thread could be 
> removing items from the tables while another thread is reading the 
> tables.  For example, unloading a class could cause an event 
> collection framework's JVM support to read the tables during a 
> ClassUnload event while the VM is removing entries from these 
> structures for modules and packages whose class loader got unloaded.
>
> The fix also cleans up management of package qualified export lists.
>
> Open Webrev: 
> http://cr.openjdk.java.net/~hseigel/bug_8170870/webrev/index.html
>
> JBS Bug:  https://bugs.openjdk.java.net/browse/JDK-8170870
>
> The fix was tested with the JCK Lang and vm tests, the JTreg hotspot, 
> java/io, java/lang, and java/util tests and the nsk cololocated and 
> the non-colocated tests.
>
> Thanks, Harold
>



More information about the hotspot-runtime-dev mailing list