aboutsummaryrefslogtreecommitdiff
path: root/src/share/classes/java/util/concurrent
diff options
context:
space:
mode:
authordl <none@none>2015-06-16 13:13:05 +0200
committerdl <none@none>2015-06-16 13:13:05 +0200
commit47868fa77e41ef3046a4ddf2b8770eb21a0fac62 (patch)
tree09d9672e06d0ce53043ac6a1bcbdb6c649cb1cf1 /src/share/classes/java/util/concurrent
parentaf5417a575caa9dd53fecf8600676e6021fb8d98 (diff)
downloadjdk8u_jdk-47868fa77e41ef3046a4ddf2b8770eb21a0fac62.tar.gz
8085978: LinkedTransferQueue<T>.spliterator can report LTQ.Node object, not T
Reviewed-by: psandoz, martin
Diffstat (limited to 'src/share/classes/java/util/concurrent')
-rw-r--r--src/share/classes/java/util/concurrent/LinkedTransferQueue.java20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/share/classes/java/util/concurrent/LinkedTransferQueue.java b/src/share/classes/java/util/concurrent/LinkedTransferQueue.java
index 5ebd04923d..b59042653e 100644
--- a/src/share/classes/java/util/concurrent/LinkedTransferQueue.java
+++ b/src/share/classes/java/util/concurrent/LinkedTransferQueue.java
@@ -780,7 +780,9 @@ public class LinkedTransferQueue<E> extends AbstractQueue<E>
}
/**
- * Version of firstOfMode used by Spliterator
+ * Version of firstOfMode used by Spliterator. Callers must
+ * recheck if the returned node's item field is null or
+ * self-linked before using.
*/
final Node firstDataNode() {
for (Node p = head; p != null;) {
@@ -953,11 +955,12 @@ public class LinkedTransferQueue<E> extends AbstractQueue<E>
Object[] a = new Object[n];
int i = 0;
do {
- if ((a[i] = p.item) != null)
+ Object e = p.item;
+ if (e != p && (a[i] = e) != null)
++i;
if (p == (p = p.next))
p = q.firstDataNode();
- } while (p != null && i < n);
+ } while (p != null && i < n && p.isData);
if ((current = p) == null)
exhausted = true;
if (i > 0) {
@@ -980,11 +983,11 @@ public class LinkedTransferQueue<E> extends AbstractQueue<E>
exhausted = true;
do {
Object e = p.item;
+ if (e != null && e != p)
+ action.accept((E)e);
if (p == (p = p.next))
p = q.firstDataNode();
- if (e != null)
- action.accept((E)e);
- } while (p != null);
+ } while (p != null && p.isData);
}
}
@@ -997,10 +1000,11 @@ public class LinkedTransferQueue<E> extends AbstractQueue<E>
((p = current) != null || (p = q.firstDataNode()) != null)) {
Object e;
do {
- e = p.item;
+ if ((e = p.item) == p)
+ e = null;
if (p == (p = p.next))
p = q.firstDataNode();
- } while (e == null && p != null);
+ } while (e == null && p != null && p.isData);
if ((current = p) == null)
exhausted = true;
if (e != null) {