Skip to content

Commit

Permalink
8325255: jdk.internal.util.ReferencedKeySet::add using wrong test
Browse files Browse the repository at this point in the history
Backport-of: a7461de231da20ed78a7c6ad8275f1bafbfa556c
  • Loading branch information
shipilev committed May 15, 2024
1 parent 5b5d778 commit 2429a90
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -439,4 +439,30 @@ private static <T> T internKey(ReferencedKeyMap<T, ReferenceKey<T>> setMap, T ke
return interned;
}


/**
* Attempt to add key to map if absent.
*
* @param setMap {@link ReferencedKeyMap} where interning takes place
* @param key key to add
*
* @param <T> type of key
*
* @return true if the key was added
*/
static <T> boolean internAddKey(ReferencedKeyMap<T, ReferenceKey<T>> setMap, T key) {
ReferenceKey<T> entryKey = setMap.entryKey(key);
setMap.removeStaleReferences();
ReferenceKey<T> existing = setMap.map.putIfAbsent(entryKey, entryKey);
if (existing == null) {
return true;
} else {
// If {@code putIfAbsent} returns non-null then was actually a
// {@code replace} and older key was used. In that case the new
// key was not used and the reference marked stale.
entryKey.unused();
return false;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ public boolean contains(Object o) {

@Override
public boolean add(T e) {
return intern(e) == null;
return ReferencedKeyMap.internAddKey(map, e);
}

@Override
Expand Down
6 changes: 6 additions & 0 deletions test/jdk/jdk/internal/util/ReferencedKeyTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,12 @@ static void methods(ReferencedKeySet<Long> set) {
assertTrue(element1 == intern1, "intern failed"); // must be same object
assertTrue(intern2 != null, "intern failed");
assertTrue(element3 == intern3, "intern failed");

Long value1 = Long.valueOf(BASE_KEY + 999);
Long value2 = Long.valueOf(BASE_KEY + 999);
assertTrue(set.add(value1), "key not added");
assertTrue(!set.add(value1), "key added after second attempt");
assertTrue(!set.add(value2), "key should not have been added");
}

// Borrowed from jdk.test.lib.util.ForceGC but couldn't use from java.base/jdk.internal.util
Expand Down

1 comment on commit 2429a90

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.