Optimize method io.netty.util.concurrent.DefaultPromise.await0(...) (#11504)

Motivation:

For the code pattern of `Object.wait(...)`  in `io.netty.util.concurrent.DefaultPromise.await0(...)`, it's better to follow the recommended code pattern according to [Object.wait(...)'s doc](https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait()):
```
synchronized (obj) {
     while (<condition does not hold>)
     obj.wait();
     ... // Perform action appropriate to condition
}
```

Modification:
Change the `Object.wait(...)`'s code pattern in `io.netty.util.concurrent.DefaultPromise.await0(...)`.

Result:

The `Object.wait(...)`'s code pattern in `io.netty.util.concurrent.DefaultPromise.await0(...)` meets the Java doc.
This commit is contained in:
old driver 2021-07-26 14:32:53 +08:00 committed by GitHub
parent eb99f6c74a
commit 8f2fe8659b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -666,15 +666,14 @@ public class DefaultPromise<V> extends AbstractFuture<V> implements Promise<V> {
checkDeadLock(); checkDeadLock();
long startTime = System.nanoTime(); // Start counting time from here instead of the first line of this method,
long waitTime = timeoutNanos; // to avoid/postpone performance cost of System.nanoTime().
final long startTime = System.nanoTime();
synchronized (this) {
boolean interrupted = false; boolean interrupted = false;
try { try {
for (;;) { long waitTime = timeoutNanos;
synchronized (this) { while (!isDone() && waitTime > 0) {
if (isDone()) {
return true;
}
incWaiters(); incWaiters();
try { try {
wait(waitTime / 1000000, (int) (waitTime % 1000000)); wait(waitTime / 1000000, (int) (waitTime % 1000000));
@ -687,22 +686,22 @@ public class DefaultPromise<V> extends AbstractFuture<V> implements Promise<V> {
} finally { } finally {
decWaiters(); decWaiters();
} }
} // Check isDone() in advance, try to avoid calculating the elapsed time later.
if (isDone()) { if (isDone()) {
return true; return true;
} else { }
// Calculate the elapsed time here instead of in the while condition,
// try to avoid performance cost of System.nanoTime() in the first loop of while.
waitTime = timeoutNanos - (System.nanoTime() - startTime); waitTime = timeoutNanos - (System.nanoTime() - startTime);
if (waitTime <= 0) { }
return isDone(); return isDone();
}
}
}
} finally { } finally {
if (interrupted) { if (interrupted) {
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
} }
} }
} }
}
/** /**
* Notify all progressive listeners. * Notify all progressive listeners.