401 |
|
* and don't wait at all, so are trapped in transfer |
402 |
|
* method rather than calling awaitFulfill. |
403 |
|
*/ |
404 |
< |
long lastTime = timed ? System.nanoTime() : 0; |
404 |
> |
final long deadline = timed ? System.nanoTime() + nanos : 0L; |
405 |
|
Thread w = Thread.currentThread(); |
406 |
|
int spins = (shouldSpin(s) ? |
407 |
|
(timed ? maxTimedSpins : maxUntimedSpins) : 0); |
412 |
|
if (m != null) |
413 |
|
return m; |
414 |
|
if (timed) { |
415 |
< |
long now = System.nanoTime(); |
416 |
< |
nanos -= now - lastTime; |
417 |
< |
lastTime = now; |
418 |
< |
if (nanos <= 0) { |
415 |
> |
nanos = deadline - System.nanoTime(); |
416 |
> |
if (nanos <= 0L) { |
417 |
|
s.tryCancel(); |
418 |
|
continue; |
419 |
|
} |
705 |
|
*/ |
706 |
|
Object awaitFulfill(QNode s, E e, boolean timed, long nanos) { |
707 |
|
/* Same idea as TransferStack.awaitFulfill */ |
708 |
< |
long lastTime = timed ? System.nanoTime() : 0; |
708 |
> |
final long deadline = timed ? System.nanoTime() + nanos : 0L; |
709 |
|
Thread w = Thread.currentThread(); |
710 |
|
int spins = ((head.next == s) ? |
711 |
|
(timed ? maxTimedSpins : maxUntimedSpins) : 0); |
716 |
|
if (x != e) |
717 |
|
return x; |
718 |
|
if (timed) { |
719 |
< |
long now = System.nanoTime(); |
720 |
< |
nanos -= now - lastTime; |
723 |
< |
lastTime = now; |
724 |
< |
if (nanos <= 0) { |
719 |
> |
nanos = deadline - System.nanoTime(); |
720 |
> |
if (nanos <= 0L) { |
721 |
|
s.tryCancel(e); |
722 |
|
continue; |
723 |
|
} |