6981113: Add ConcurrentLinkedDeque
Summary: Extend techniques developed for ConcurrentLinkedQueue and LinkedTransferQueue to implement a non-blocking concurrent Deque with interior removes.
Reviewed-by: martin, dholmes, chegar
diff --git a/test/java/util/Collection/BiggernYours.java b/test/java/util/Collection/BiggernYours.java
index 8a0e2d1..d1e1e61 100644
--- a/test/java/util/Collection/BiggernYours.java
+++ b/test/java/util/Collection/BiggernYours.java
@@ -174,6 +174,11 @@
public int size() {return randomize(super.size());}});
testCollections(
+ new ConcurrentLinkedDeque(),
+ new ConcurrentLinkedDeque() {
+ public int size() {return randomize(super.size());}});
+
+ testCollections(
new ConcurrentLinkedQueue(),
new ConcurrentLinkedQueue() {
public int size() {return randomize(super.size());}});
diff --git a/test/java/util/Collection/IteratorAtEnd.java b/test/java/util/Collection/IteratorAtEnd.java
index 4f9cd0a..9d10f33 100644
--- a/test/java/util/Collection/IteratorAtEnd.java
+++ b/test/java/util/Collection/IteratorAtEnd.java
@@ -48,6 +48,7 @@
testCollection(new PriorityQueue());
testCollection(new LinkedBlockingQueue());
testCollection(new ArrayBlockingQueue(100));
+ testCollection(new ConcurrentLinkedDeque());
testCollection(new ConcurrentLinkedQueue());
testCollection(new LinkedTransferQueue());
diff --git a/test/java/util/Collection/MOAT.java b/test/java/util/Collection/MOAT.java
index 1334474..4de8ca6 100644
--- a/test/java/util/Collection/MOAT.java
+++ b/test/java/util/Collection/MOAT.java
@@ -75,6 +75,7 @@
testCollection(new ArrayBlockingQueue<Integer>(20));
testCollection(new LinkedBlockingQueue<Integer>(20));
testCollection(new LinkedBlockingDeque<Integer>(20));
+ testCollection(new ConcurrentLinkedDeque<Integer>());
testCollection(new ConcurrentLinkedQueue<Integer>());
testCollection(new LinkedTransferQueue<Integer>());
testCollection(new ConcurrentSkipListSet<Integer>());
@@ -431,8 +432,9 @@
q.poll();
equal(q.size(), 4);
checkFunctionalInvariants(q);
- if ((q instanceof LinkedBlockingQueue) ||
- (q instanceof LinkedBlockingDeque) ||
+ if ((q instanceof LinkedBlockingQueue) ||
+ (q instanceof LinkedBlockingDeque) ||
+ (q instanceof ConcurrentLinkedDeque) ||
(q instanceof ConcurrentLinkedQueue)) {
testQueueIteratorRemove(q);
}