From 59ea4a31507c04448ad3639f1990c5c184209d08 Mon Sep 17 00:00:00 2001 From: Chris Dennis Date: Mon, 14 Jan 2013 18:41:09 -0500 Subject: [PATCH] add test and correct logic for failed replace on never used slot --- src/main/java/org/cliffc/high_scale_lib/NonBlockingHashMap.java | 2 +- .../java/org/cliffc/high_scale_lib/NonBlockingHashMapTest.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/cliffc/high_scale_lib/NonBlockingHashMap.java b/src/main/java/org/cliffc/high_scale_lib/NonBlockingHashMap.java index ce4ec6d..11c0142 100644 --- a/src/main/java/org/cliffc/high_scale_lib/NonBlockingHashMap.java +++ b/src/main/java/org/cliffc/high_scale_lib/NonBlockingHashMap.java @@ -667,7 +667,7 @@ private static final Object putIfMatch( final NonBlockingHashMap topmap, final O (expVal != MATCH_ANY || V == TOMBSTONE || V == null) && !(V==null && expVal == TOMBSTONE) && // Match on null/TOMBSTONE combo (expVal == null || !expVal.equals(V)) ) // Expensive equals check at the last - return V; // Do not update! + return (V==null && expVal!=null) ? TOMBSTONE : V; // Do not update! // Actually change the Value in the Key,Value pair if( CAS_val(kvs, idx, V, putval ) ) { diff --git a/src/test/java/org/cliffc/high_scale_lib/NonBlockingHashMapTest.java b/src/test/java/org/cliffc/high_scale_lib/NonBlockingHashMapTest.java index 045b62a..97c4b88 100644 --- a/src/test/java/org/cliffc/high_scale_lib/NonBlockingHashMapTest.java +++ b/src/test/java/org/cliffc/high_scale_lib/NonBlockingHashMapTest.java @@ -36,6 +36,7 @@ public boolean equals( Object o ) { // Test some basic stuff; add a few keys, remove a few keys public void testBasic() { assertTrue ( _nbhm.isEmpty() ); + assertThat ( _nbhm.replace("k0","v0"), nullValue() ); assertThat ( _nbhm.putIfAbsent("k1","v1"), nullValue() ); checkSizes (1); assertThat ( _nbhm.putIfAbsent("k2","v2"), nullValue() );