forked from I2P_Developers/i2p.i2p
SSU: Fix calculation of nextSendDelay (ticket #2714)
patch from zlatinb
This commit is contained in:
@ -270,8 +270,8 @@ class OutboundMessageFragments {
|
||||
List<OutboundMessageState> states = null;
|
||||
// Keep track of how many we've looked at, since we don't start the iterator at the beginning.
|
||||
int peersProcessed = 0;
|
||||
while (_alive && (states == null) ) {
|
||||
int nextSendDelay = Integer.MAX_VALUE;
|
||||
while (_alive && (states == null) ) {
|
||||
// no, not every time - O(n**2) - do just before waiting below
|
||||
//finishMessages();
|
||||
|
||||
@ -288,8 +288,8 @@ class OutboundMessageFragments {
|
||||
// Otherwise, wait()
|
||||
long now = _context.clock().now();
|
||||
while (_iterator.hasNext()) {
|
||||
peer = _iterator.next();
|
||||
int remaining = peer.finishMessages(now);
|
||||
PeerState p = _iterator.next();
|
||||
int remaining = p.finishMessages(now);
|
||||
if (remaining <= 0) {
|
||||
// race with add()
|
||||
_iterator.remove();
|
||||
@ -298,20 +298,19 @@ class OutboundMessageFragments {
|
||||
continue;
|
||||
}
|
||||
peersProcessed++;
|
||||
states = peer.allocateSend();
|
||||
states = p.allocateSend();
|
||||
if (states != null) {
|
||||
peer = p;
|
||||
// we have something to send and we will be returning it
|
||||
break;
|
||||
} else if (peersProcessed >= _activePeers.size()) {
|
||||
// we've gone all the way around, time to sleep
|
||||
break;
|
||||
} else {
|
||||
// Update the minimum delay for all peers
|
||||
// which will be used if we found nothing to send across all peers
|
||||
int delay = peer.getNextDelay();
|
||||
}
|
||||
int delay = p.getNextDelay();
|
||||
if (delay < nextSendDelay)
|
||||
nextSendDelay = delay;
|
||||
peer = null;
|
||||
|
||||
if (peersProcessed >= _activePeers.size()) {
|
||||
// we've gone all the way around, time to sleep
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -329,8 +328,10 @@ class OutboundMessageFragments {
|
||||
// use max of 1 second so finishMessages() and/or PeerState.finishMessages()
|
||||
// gets called regularly
|
||||
int toWait = Math.min(Math.max(nextSendDelay, 10), MAX_WAIT);
|
||||
//if (_log.shouldLog(Log.DEBUG))
|
||||
// _log.debug("wait for " + toWait);
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("wait for " + toWait);
|
||||
|
||||
nextSendDelay = Integer.MAX_VALUE;
|
||||
// wait.. or somethin'
|
||||
synchronized (_activePeers) {
|
||||
try {
|
||||
|
Reference in New Issue
Block a user