Fix a bug introduced by 79706357c7 which can cause thread to spin in an infinite loop. (#9579)

Motivation:
peek() is implemented in a similar way to poll() for the mpsc queue, thus it is more like a consumer call.
It is possible that we could have multiple thread call peek() and possibly one thread calls poll() at at the same time.
This lead to multiple consumer scenario, which violates the multiple producer single consumer condition and could lead to spin in an infinite loop in peek()

Modification:
Use isEmpty() instead of peek() to check if task queue is empty

Result:
Dont violate the mpsc semantics.
This commit is contained in:
wyzhang 2019-09-19 02:59:51 -07:00 committed by Norman Maurer
parent 3ad037470e
commit 338e1a991c

View File

@ -274,7 +274,7 @@ public final class NonStickyEventExecutorGroup implements EventExecutorGroup {
//
// The above cases can be distinguished by performing a
// compareAndSet(NONE, RUNNING). If it returns "false", it is case 1; otherwise it is case 2.
if (tasks.peek() == null || !state.compareAndSet(NONE, RUNNING)) {
if (tasks.isEmpty() || !state.compareAndSet(NONE, RUNNING)) {
return; // done
}
}