diff options
author | dl <none@none> | 2015-06-16 13:13:05 +0200 |
---|---|---|
committer | dl <none@none> | 2015-06-16 13:13:05 +0200 |
commit | 47868fa77e41ef3046a4ddf2b8770eb21a0fac62 (patch) | |
tree | 09d9672e06d0ce53043ac6a1bcbdb6c649cb1cf1 /src/share/classes/java/util/concurrent | |
parent | af5417a575caa9dd53fecf8600676e6021fb8d98 (diff) | |
download | jdk8u_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.java | 20 |
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) { |