On Wed, 8 Oct 2025 12:35:21 GMT, David Beaumont <[email protected]> wrote:

>> src/java.base/share/classes/jdk/internal/jimage/ImageLocation.java line 87:
>> 
>>> 85:      * for {@code /packages/xxx} directories).
>>> 86:      */
>>> 87:     public static final int FLAGS_IS_PREVIEW_ONLY = 0x4;
>> 
>> The preview-only case is expected to be the empty set. There seems to be a 
>> lot of code dedicated to it.
>
> Well it's a small set, but vitally important. Preview only is the case where 
> you can't lookup the normal resource first and check its flags to see if 
> there's a preview version. Since you must correct find all preview-only 
> resources, you are left with either:
> 
> * *always* speculatively looking up all resources in their preview location 
> when not found otherwise.
> * Doing something "cleverer" to reduce double lookups.
> 
> In the C++ class-loader (as I understand it) most lookups will be for things 
> referenced in other class files, and thus expected to exist. This makes "if 
> you can't find the normal version, look for the preview version" acceptable 
> (I think) because this should be only in cases where you're looking for 
> something that should exist at one of the two paths.
> 
> In the Java stuff, there's a lot of speculative lookup, especially for 
> non-class resources. All modules are tested for any non-existent resource. So 
> in this case the strategy needs to be cleverer or you'll basically (at least) 
> double the cost of a lot of things.
> 
> So I settled on the easiest approach to be to just (efficiently) pre-scan for 
> preview resources and put them in the node cache during init (this is only 
> about the same work the old code did for link nodes etc.). Once they're 
> cached, the lookup code no longer has to care about 2nd lookups or anything. 
> Preview versions and preview-only versions are just treated the same, they're 
> in the cache, so they're found and returned without looking at anything else.
> 
> This is partly why there's the "ensureCached" method which guarantees you 
> never replace what's in the cache with anything else (so preview stuff put 
> there during init of the reader is "safe" from accidental overwriting).
> 
> The new flag stuff and change of ordering of package entries is there mostly 
> to support efficient pre-scanning of the small set of preview only resources.

I'm still going to say, there are no plans to have any Preview-only resources.

And yes, a preview-only flag would be useful to (mostly) avoid a second lookup.
If I understand the design, there is still a location in the normal tree with 
the preview-only flag but there is no resource at that location, only the 
flags.  And a second lookup is needed to find the location in the preview 
heirarchy. The caching avoids repeated 2nd lookups.

>> src/java.base/share/classes/jdk/internal/jrtfs/JrtFileSystemProvider.java 
>> line 125:
>> 
>>> 123:         } else if (envValue instanceof String && 
>>> Boolean.parseBoolean((String) envValue)) {
>>> 124:             return PreviewMode.ENABLED;
>>> 125:         }
>> 
>> This kind of ambiguous type for the environment variable should not be 
>> supported. 
>> Pick a type and stick to it.  
>> Whereever the jrt: file system is specified will need a description for 
>> enablePreview to be added to the spec.
>
> Other file-system flags already do this, so I was just copying that approach. 
> Happy to not do this though.
> Which do you suggest, Boolean or String?

Strings are more frequent and conventional.

>> src/java.base/share/classes/jdk/internal/jrtfs/SystemImage.java line 79:
>> 
>>> 77: 
>>> 78:         // TODO: Maybe throw if enablePreview attempted for exploded 
>>> image?
>>> 79: 
>> 
>> Exploded image is useful for debugging, it could support preview mode using 
>> the same META-INF directory structure.
>
> Indeed. I can support it later, I'm just wondering if, in this partially 
> complete state, I should complain or not.
> I've got most of the code for that done somewhere or other.

Throwing with a message would avoid doubt about whether it is supported.

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

PR Review Comment: 
https://git.openjdk.org/valhalla/pull/1619#discussion_r2414290560
PR Review Comment: 
https://git.openjdk.org/valhalla/pull/1619#discussion_r2414296625
PR Review Comment: 
https://git.openjdk.org/valhalla/pull/1619#discussion_r2414298186

Reply via email to