491 |
|
*/ |
492 |
|
private Object awaitNanos(Node node, Slot slot, long nanos) { |
493 |
|
int spins = TIMED_SPINS; |
494 |
< |
long lastTime = 0; |
494 |
> |
long deadline = 0L; |
495 |
|
Thread w = null; |
496 |
|
for (;;) { |
497 |
|
Object v = node.get(); |
498 |
|
if (v != null) |
499 |
|
return v; |
500 |
|
long now = System.nanoTime(); |
501 |
< |
if (w == null) |
501 |
> |
if (w == null) { |
502 |
> |
deadline = now + nanos; |
503 |
|
w = Thread.currentThread(); |
504 |
+ |
} |
505 |
|
else |
506 |
< |
nanos -= now - lastTime; |
507 |
< |
lastTime = now; |
506 |
< |
if (nanos > 0) { |
506 |
> |
nanos = deadline - now; |
507 |
> |
if (nanos > 0L) { |
508 |
|
if (spins > 0) |
509 |
|
--spins; |
510 |
|
else if (node.waiter == null) |