Author: toad
Date: 2008-03-11 15:08:11 +0000 (Tue, 11 Mar 2008)
New Revision: 18461
Modified:
trunk/freenet/src/freenet/node/RequestSender.java
Log:
Prevent sendTerminal from being called twice when a race condition occurs.
Modified: trunk/freenet/src/freenet/node/RequestSender.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestSender.java 2008-03-11 15:02:36 UTC
(rev 18460)
+++ trunk/freenet/src/freenet/node/RequestSender.java 2008-03-11 15:08:11 UTC
(rev 18461)
@@ -1179,27 +1179,37 @@
}
public void addListener(Listener l) {
+ // Only call here if we've already called for the other
listeners.
+ // Therefore the callbacks will only be called once.
boolean reject=false;
boolean transfer=false;
+ boolean sentFinished;
int status;
synchronized (this) {
synchronized (listeners) {
listeners.add(l);
+ reject = sentReceivedRejectOverload;
+ transfer = sentCHKTransferBegins;
+ sentFinished = sentRequestSenderFinished;
}
- reject=hasForwardedRejectedOverload;
- transfer=transferStarted();
+ reject=reject && hasForwardedRejectedOverload;
+ transfer=transfer && transferStarted();
status=this.status;
}
if (reject)
l.onReceivedRejectOverload();
if (transfer)
l.onCHKTransferBegins();
- if (status!=NOT_FINISHED)
+ if (status!=NOT_FINISHED && sentFinished)
l.onRequestSenderFinished(status);
}
+ private boolean sentReceivedRejectOverload;
+
private void fireReceivedRejectOverload() {
synchronized (listeners) {
+ if(sentReceivedRejectOverload) return;
+ sentReceivedRejectOverload = true;
Iterator i=listeners.iterator();
while (i.hasNext()) {
Listener l=(Listener)i.next();
@@ -1212,8 +1222,11 @@
}
}
+ private boolean sentCHKTransferBegins;
+
private void fireCHKTransferBegins() {
synchronized (listeners) {
+ sentCHKTransferBegins = true;
Iterator i=listeners.iterator();
while (i.hasNext()) {
Listener l=(Listener)i.next();
@@ -1226,8 +1239,11 @@
}
}
+ private boolean sentRequestSenderFinished;
+
private void fireRequestSenderFinished(int status) {
synchronized (listeners) {
+ sentRequestSenderFinished = true;
Iterator i=listeners.iterator();
while (i.hasNext()) {
Listener l=(Listener)i.next();