8325255: jdk.internal.util.ReferencedKeySet::add using wrong test
Reviewed-by: rriggs, liach
This commit is contained in:
parent
2bdd38716c
commit
a7461de231
@ -439,4 +439,30 @@ public final class ReferencedKeyMap<K, V> implements Map<K, V> {
|
|||||||
return interned;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -148,7 +148,7 @@ public final class ReferencedKeySet<T> extends AbstractSet<T> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean add(T e) {
|
public boolean add(T e) {
|
||||||
return intern(e) == null;
|
return ReferencedKeyMap.internAddKey(map, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -127,6 +127,12 @@ public class ReferencedKeyTest {
|
|||||||
assertTrue(element1 == intern1, "intern failed"); // must be same object
|
assertTrue(element1 == intern1, "intern failed"); // must be same object
|
||||||
assertTrue(intern2 != null, "intern failed");
|
assertTrue(intern2 != null, "intern failed");
|
||||||
assertTrue(element3 == intern3, "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
|
// Borrowed from jdk.test.lib.util.ForceGC but couldn't use from java.base/jdk.internal.util
|
||||||
|
Loading…
x
Reference in New Issue
Block a user