502 |
|
if (isData == haveData) // can't match |
503 |
|
break; |
504 |
|
if (p.casItem(item, e)) { // match |
505 |
< |
Thread w = p.waiter; |
506 |
< |
while (p != h) { // update head |
507 |
< |
Node n = p.next; // by 2 unless singleton |
508 |
< |
if (n != null) |
509 |
< |
p = n; |
510 |
< |
if (head == h && casHead(h, p)) { |
505 |
> |
for (Node q = p; q != h;) { |
506 |
> |
Node n = q.next; // update head by 2 |
507 |
> |
if (n != null) // unless singleton |
508 |
> |
q = n; |
509 |
> |
if (head == h && casHead(h, q)) { |
510 |
|
h.forgetNext(); |
511 |
|
break; |
512 |
|
} // advance and retry |
513 |
|
if ((h = head) == null || |
514 |
< |
(p = h.next) == null || !p.isMatched()) |
514 |
> |
(q = h.next) == null || !q.isMatched()) |
515 |
|
break; // unless slack < 2 |
516 |
|
} |
517 |
< |
LockSupport.unpark(w); |
517 |
> |
LockSupport.unpark(p.waiter); |
518 |
|
return item; |
519 |
|
} |
520 |
|
} |
612 |
|
Thread.yield(); // occasionally yield |
613 |
|
} |
614 |
|
else if (s.waiter == null) { |
615 |
< |
s.waiter = w; // request unpark |
615 |
> |
s.waiter = w; // request unpark then recheck |
616 |
|
} |
617 |
|
else if (how == TIMEOUT) { |
618 |
|
long now = System.nanoTime(); |
622 |
|
} |
623 |
|
else { |
624 |
|
LockSupport.park(this); |
625 |
+ |
s.waiter = null; |
626 |
|
spins = -1; // spin if front upon wakeup |
627 |
|
} |
628 |
|
} |