502 |
|
if (isData == haveData) // can't match |
503 |
|
break; |
504 |
|
if (p.casItem(item, e)) { // match |
505 |
< |
Thread w = p.waiter; |
505 |
> |
LockSupport.unpark(p.waiter); |
506 |
|
while (p != h) { // update head |
507 |
|
Node n = p.next; // by 2 unless singleton |
508 |
|
if (n != null) |
515 |
|
(p = h.next) == null || !p.isMatched()) |
516 |
|
break; // unless slack < 2 |
517 |
|
} |
518 |
– |
LockSupport.unpark(w); |
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 |
|
} |