362 |
|
*/ |
363 |
|
private int awaitDone(boolean timed, long nanos) |
364 |
|
throws InterruptedException { |
365 |
< |
long last = timed ? System.nanoTime() : 0L; |
365 |
> |
final long deadline = timed ? System.nanoTime() + nanos : 0L; |
366 |
|
WaitNode q = null; |
367 |
|
boolean queued = false; |
368 |
|
for (;;) { |
385 |
|
queued = UNSAFE.compareAndSwapObject(this, waitersOffset, |
386 |
|
q.next = waiters, q); |
387 |
|
else if (timed) { |
388 |
< |
long now = System.nanoTime(); |
389 |
< |
if ((nanos -= (now - last)) <= 0L) { |
388 |
> |
nanos = deadline - System.nanoTime(); |
389 |
> |
if (nanos <= 0L) { |
390 |
|
removeWaiter(q); |
391 |
|
return state; |
392 |
|
} |
393 |
– |
last = now; |
393 |
|
LockSupport.parkNanos(this, nanos); |
394 |
|
} |
395 |
|
else |