Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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