From 58623faf53138f63ec1a8a73612fb55d68e9e25a Mon Sep 17 00:00:00 2001
From: Doug Lea
Date: Mon, 28 Nov 2016 23:39:54 -0800
Subject: [PATCH] 8166507: ConcurrentSkipListSet.clear() can leave the Set in
an invalid state
Reviewed-by: martin, smarks, psandoz
---
.../concurrent/ConcurrentSkipListMap.java | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java b/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java
index 7734a265bed..2ae29aa42f3 100644
--- a/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java
@@ -1650,7 +1650,24 @@ public class ConcurrentSkipListMap extends AbstractMap
* Removes all of the mappings from this map.
*/
public void clear() {
- initialize();
+ for (;;) {
+ Node b, n;
+ HeadIndex h = head, d = (HeadIndex)h.down;
+ if (d != null)
+ casHead(h, d); // remove levels
+ else if ((b = h.node) != null && (n = b.next) != null) {
+ Node f = n.next; // remove values
+ if (n == b.next) {
+ Object v = n.value;
+ if (v == null)
+ n.helpDelete(b, f);
+ else if (n.casValue(v, null) && n.appendMarker(f))
+ b.casNext(n, f);
+ }
+ }
+ else
+ break;
+ }
}
/**