--- jsr166/src/jsr166y/LinkedTransferQueue.java 2009/10/24 12:29:57 1.50 +++ jsr166/src/jsr166y/LinkedTransferQueue.java 2009/10/24 14:57:32 1.52 @@ -502,20 +502,19 @@ public class LinkedTransferQueue exte if (isData == haveData) // can't match break; if (p.casItem(item, e)) { // match - Thread w = p.waiter; - while (p != h) { // update head - Node n = p.next; // by 2 unless singleton - if (n != null) - p = n; - if (head == h && casHead(h, p)) { + for (Node q = p; q != h;) { + Node n = q.next; // update head by 2 + if (n != null) // unless singleton + q = n; + if (head == h && casHead(h, q)) { h.forgetNext(); break; } // advance and retry if ((h = head) == null || - (p = h.next) == null || !p.isMatched()) + (q = h.next) == null || !q.isMatched()) break; // unless slack < 2 } - LockSupport.unpark(w); + LockSupport.unpark(p.waiter); return item; } } @@ -613,7 +612,7 @@ public class LinkedTransferQueue exte Thread.yield(); // occasionally yield } else if (s.waiter == null) { - s.waiter = w; // request unpark + s.waiter = w; // request unpark then recheck } else if (how == TIMEOUT) { long now = System.nanoTime(); @@ -623,6 +622,7 @@ public class LinkedTransferQueue exte } else { LockSupport.park(this); + s.waiter = null; spins = -1; // spin if front upon wakeup } }