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:
parent
1b06de76c9
commit
bfe18bcb3c
@ -275,7 +275,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
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user