RFR: 8351996: Behavioral updates for ClassValue::remove [v10]

Chen Liang liach at openjdk.org
Wed Apr 30 17:02:55 UTC 2025


On Wed, 30 Apr 2025 09:15:49 GMT, Viktor Klang <vklang at openjdk.org> wrote:

>> Chen Liang has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains 17 additional commits since the last revision:
>> 
>>  - Rewrite impl to follow the new simplified spec
>>  - Merge branch 'master' of https://github.com/openjdk/jdk into fix/classvalue-compute-remove
>>  - Try to simplify the model - use the finish of computeValue
>>    
>>  - Test updates - remove repetition, test case for no stale installation
>>  - Fix incorrect promise removal when unnecessary and add regression test
>>  - Cannot test for recursion eagerly - add test case
>>  - More spec, eager exception, finish with existing, thanks John
>>  - Merge branch 'master' of https://github.com/openjdk/jdk into fix/classvalue-compute-remove
>>  - docs
>>  - Remove the throwing behavior due to shallow reentrancy
>>  - ... and 7 more: https://git.openjdk.org/jdk/compare/153a25f7...221d51e7
>
> src/java.base/share/classes/java/lang/ClassValue.java line 95:
> 
>> 93:      * <ul>
>> 94:      * <li>This association is already associated by another attempt. The
>> 95:      * associated value is returned.</li>
> 
> It's a bit unclear which association is referred to in the second sentence, I think that could be made clearer with something like:
> 
> Suggestion:
> 
>      * <li>This association is already associated by another attempt, so that value is returned.</li>

I think I will reword as:
"An association is already created by another attempt. The associated value is returned."

What do you think? An association is either present or absent for a coordinate. In addition, all other list entries are  "What happened. What happens next."

> src/java.base/share/classes/java/lang/ClassValue.java line 124:
> 
>> 122:      * {@return the value associated to the given {@code Class}}
>> 123:      * <p>
>> 124:      * This method first performs a read-only access, and returns the associated
> 
> I'm not 100% sure on the "read-only" label here, as it does recompute-and-store if there is no current value.

Yep, it needs a read-only access to know there is no current value...

> src/java.base/share/classes/java/lang/ClassValue.java line 167:
> 
>> 165:     public void remove(Class<?> type) {
>> 166:         ClassValueMap map = getMap(type);
>> 167:         map.removeAccess(this);
> 
> Should this really be "Access" and not "Association"?

Oh, I named all methods on `ClassValueMap` to `access`. When a remove is done, it might remove a previous remove (no association) in addition to actual associations.

> src/java.base/share/classes/java/lang/ClassValue.java line 318:
> 
>> 316:     Version<T> version() { return version; }
>> 317:     void bumpVersion() { version = new Version<>(this); }
>> 318:     static final class Version<T> {
> 
> Since this is all final components, it might serve better as a record?

Note that this class has a significant identity. Does that make it still suitable for record conversion? I think we need a comment on its identity significance if we convert.

> test/jdk/java/lang/invoke/ClassValueTest.java line 179:
> 
>> 177: 
>> 178:     private static final long COMPUTE_TIME_MILLIS = 100;
>> 179:     private static final Duration TIMEOUT = Duration.of(2, ChronoUnit.SECONDS);
> 
> In order to reduce spurious failures here, I'd probably put this timeout a bit longer—let's say 5s.

Oh, the timeout is not to reduce failures - it mainly aims to prevent accidental infinite loops from stalling tests.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/24043#discussion_r2069106581
PR Review Comment: https://git.openjdk.org/jdk/pull/24043#discussion_r2069108612
PR Review Comment: https://git.openjdk.org/jdk/pull/24043#discussion_r2069109848
PR Review Comment: https://git.openjdk.org/jdk/pull/24043#discussion_r2069113085
PR Review Comment: https://git.openjdk.org/jdk/pull/24043#discussion_r2069114518


More information about the core-libs-dev mailing list