mirror of
https://github.com/vanitasvitae/Smack.git
synced 2024-11-22 03:52:06 +01:00
[core] Fix busy-loop in SmackReactor
Fixes SMACK-938.
This commit is contained in:
parent
0fb8bfdf6c
commit
390f6f0fa7
1 changed files with 6 additions and 0 deletions
|
@ -327,6 +327,12 @@ public class SmackReactor {
|
||||||
|
|
||||||
int currentReactorThreadCount = reactorThreads.size();
|
int currentReactorThreadCount = reactorThreads.size();
|
||||||
int myKeyCount = pendingSelectionKeysSize / currentReactorThreadCount;
|
int myKeyCount = pendingSelectionKeysSize / currentReactorThreadCount;
|
||||||
|
// The division could result in myKeyCount being zero, even though there are pending selection keys.
|
||||||
|
// Therefore, ensure that this thread tries to get at least one pending selection key by invoking poll().
|
||||||
|
// Otherwise, it could happen that we end up in a busy loop, where myKeyCount is zero and this thread invokes
|
||||||
|
// selector.wakeup() below because pendingSelectionsKeys is not empty, but the woken up reactor thread wil
|
||||||
|
// end up with myKeyCount being zero again, restarting the busy-loop cycle.
|
||||||
|
if (myKeyCount == 0) myKeyCount = 1;
|
||||||
Collection<SelectionKey> selectedKeys = new ArrayList<>(myKeyCount);
|
Collection<SelectionKey> selectedKeys = new ArrayList<>(myKeyCount);
|
||||||
for (int i = 0; i < myKeyCount; i++) {
|
for (int i = 0; i < myKeyCount; i++) {
|
||||||
SelectionKey selectionKey = pendingSelectionKeys.poll();
|
SelectionKey selectionKey = pendingSelectionKeys.poll();
|
||||||
|
|
Loading…
Reference in a new issue