On Wed, 12 May 2021 05:51:14 GMT, Ioi Lam <ik...@openjdk.org> wrote:

> This bug was discovered during the development of 
> [JDK-6824466](https://bugs.openjdk.java.net/browse/JDK-6824466): when CDS is 
> enabled, if `BootLoader::loadClassOrNull` is called before `initPhase2`, it 
> would trigger the initialization of the archived module graph in the wrong 
> order. Because of unanticipated nesting of `<clinit>` methods, 
> `BootLoader::SERVICES_CATALOG` becomes empty, causing future `ServiceLoader` 
> operations to fail.
> 
> The fix has 2 parts:
> 
> - `BootLoader::loadClassOrNull` no longer calls `ClassLoaders::bootLoader()`. 
> This avoids triggering the archived module graph initialization. Instead, it 
> makes a direct call to `Classloader::findBootstrapClassOrNull()`. We don't 
> actually need a `ClassLoader` instance for this call, so I changed 
> `Classloader::findBootstrapClassOrNull()` to be a static method.
> - The object returned by `BootLoader::getServicesCatalog()` is now maintained 
> inside `jdk.internal.loader.ClassLoaders`.  Although not strictly required 
> for the fix, this simplifies the initialization of the archived module graph. 
> It also makes the logic consistent for the 3 built-in loaders 
> (boot/platform/app).
> 
> Testing: tiers1-4 in progress. I also verified that the bug reported by Mandy 
> is no longer reproducible after I applied this patch on her branch.

This pull request has now been integrated.

Changeset: 1e0ecd6d
Author:    Ioi Lam <ik...@openjdk.org>
URL:       
https://git.openjdk.java.net/jdk/commit/1e0ecd6d56541c948e0d120295f5008d3248598f
Stats:     43 lines in 8 files changed: 9 ins; 13 del; 21 mod

8265605: Cannot call BootLoader::loadClassOrNull before initPhase2

Reviewed-by: alanb, mchung

-------------

PR: https://git.openjdk.java.net/jdk/pull/3992

Reply via email to