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