Author: toad
Date: 2007-03-16 23:07:47 +0000 (Fri, 16 Mar 2007)
New Revision: 12161
Modified:
trunk/freenet/src/freenet/client/async/ClientPutter.java
trunk/freenet/src/freenet/client/async/ClientRequester.java
trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
trunk/freenet/src/freenet/client/async/USKFetcher.java
trunk/freenet/src/freenet/client/async/USKInserter.java
trunk/freenet/src/freenet/client/async/USKManager.java
Log:
Synchronization fixes
Modified: trunk/freenet/src/freenet/client/async/ClientPutter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientPutter.java 2007-03-16
22:22:04 UTC (rev 12160)
+++ trunk/freenet/src/freenet/client/async/ClientPutter.java 2007-03-16
23:07:47 UTC (rev 12161)
@@ -169,14 +169,15 @@
}
public void cancel() {
+ ClientPutState oldState = null;
synchronized(this) {
if(cancelled) return;
super.cancel();
- if(currentState != null)
- currentState.cancel();
+ oldState = currentState;
if(startedStarting) return;
startedStarting = true;
}
+ if(oldState != null) oldState.cancel();
onFailure(new InserterException(InserterException.CANCELLED),
null);
}
Modified: trunk/freenet/src/freenet/client/async/ClientRequester.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientRequester.java 2007-03-16
22:22:04 UTC (rev 12160)
+++ trunk/freenet/src/freenet/client/async/ClientRequester.java 2007-03-16
23:07:47 UTC (rev 12161)
@@ -33,7 +33,7 @@
this.client = client;
}
- public void cancel() {
+ public synchronized void cancel() {
cancelled = true;
}
Modified: trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
2007-03-16 22:22:04 UTC (rev 12160)
+++ trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
2007-03-16 23:07:47 UTC (rev 12161)
@@ -236,13 +236,17 @@
// FIXME do something.
}
- public synchronized void start() throws InserterException {
+ public void start() throws InserterException {
logMINOR = Logger.shouldLog(Logger.MINOR, this);
if(logMINOR) Logger.minor(this, "Starting "+this);
PutHandler[] running;
+
+ boolean cancel = false;
+
+ synchronized(this) {
+ cancel = cancelled;
+ if(!cancelled) {
running = (PutHandler[]) runningPutHandlers.toArray(new
PutHandler[runningPutHandlers.size()]);
-
- if(cancelled) cancel();
try {
for(int i=0;i<running.length;i++) {
running[i].start();
@@ -257,6 +261,9 @@
cancelAndFinish();
throw e;
}
+ }
+ }
+ if(cancel) cancel();
}
private void makePutHandlers(HashMap manifestElements, HashMap
putHandlersByName) throws InserterException {
Modified: trunk/freenet/src/freenet/client/async/USKFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKFetcher.java 2007-03-16
22:22:04 UTC (rev 12160)
+++ trunk/freenet/src/freenet/client/async/USKFetcher.java 2007-03-16
23:07:47 UTC (rev 12161)
@@ -385,12 +385,24 @@
onDNF(attempt);
}
- private synchronized void cancelBefore(long curLatest) {
- for(Iterator i=runningAttempts.iterator();i.hasNext();) {
- USKAttempt att = (USKAttempt) (i.next());
- if(att.number < curLatest) {
+ private void cancelBefore(long curLatest) {
+ Vector v = null;
+ int count = 0;
+ synchronized(this) {
+ for(Iterator i=runningAttempts.iterator();i.hasNext();)
{
+ USKAttempt att = (USKAttempt) (i.next());
+ if(att.number < curLatest) {
+ if(v == null) v = new
Vector(runningAttempts.size()-count);
+ v.add(att);
+ i.remove();
+ }
+ count++;
+ }
+ }
+ if(v != null) {
+ for(int i=0;i<v.size();i++) {
+ USKAttempt att = (USKAttempt) v.get(i);
att.cancel();
- i.remove();
}
}
}
Modified: trunk/freenet/src/freenet/client/async/USKInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKInserter.java 2007-03-16
22:22:04 UTC (rev 12160)
+++ trunk/freenet/src/freenet/client/async/USKInserter.java 2007-03-16
23:07:47 UTC (rev 12161)
@@ -177,12 +177,14 @@
return parent;
}
- public synchronized void cancel() {
- finished = true;
+ public void cancel() {
if(fetcher != null)
fetcher.cancel();
if(sbi != null)
sbi.cancel();
+ synchronized(this) {
+ finished = true;
+ }
cb.onFailure(new
InserterException(InserterException.CANCELLED), this);
}
Modified: trunk/freenet/src/freenet/client/async/USKManager.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKManager.java 2007-03-16
22:22:04 UTC (rev 12160)
+++ trunk/freenet/src/freenet/client/async/USKManager.java 2007-03-16
23:07:47 UTC (rev 12161)
@@ -4,6 +4,7 @@
package freenet.client.async;
import java.util.HashMap;
+import java.util.Vector;
import freenet.client.FetchContext;
import freenet.keys.USK;
@@ -93,6 +94,7 @@
public void startTemporaryBackgroundFetcher(USK usk) {
USK clear = usk.clearCopy();
USKFetcher sched = null;
+ Vector toCancel = null;
synchronized(this) {
USKFetcher f = (USKFetcher)
backgroundFetchersByClearUSK.get(clear);
if(f == null) {
@@ -105,7 +107,8 @@
USK del = (USK)
temporaryBackgroundFetchersLRU.pop();
USKFetcher fetcher = (USKFetcher)
backgroundFetchersByClearUSK.get(del.clearCopy());
if(!fetcher.hasSubscribers()) {
- fetcher.cancel();
+ if(toCancel == null) toCancel = new
Vector(2);
+ toCancel.add(fetcher);
backgroundFetchersByClearUSK.remove(fetcher);
} else {
if(Logger.shouldLog(Logger.MINOR, this))
@@ -115,6 +118,12 @@
}
}
}
+ if(toCancel != null) {
+ for(int i=0;i<toCancel.size();i++) {
+ USKFetcher fetcher = (USKFetcher)
toCancel.get(i);
+ fetcher.cancel();
+ }
+ }
if(sched != null) sched.schedule();
}
@@ -179,6 +188,7 @@
}
public void unsubscribe(USK origUSK, USKCallback cb, boolean
runBackgroundFetch) {
+ USKFetcher toCancel = null;
synchronized(this) {
USK clear = origUSK.clearCopy();
USKCallback[] callbacks = (USKCallback[])
subscribersByClearUSK.get(clear);
@@ -209,12 +219,13 @@
f.removeSubscriber(cb);
if(!f.hasSubscribers()) {
if(!temporaryBackgroundFetchersLRU.contains(clear)) {
- f.cancel();
+ toCancel = f;
backgroundFetchersByClearUSK.remove(clear);
}
}
}
}
+ if(toCancel != null) toCancel.cancel();
}
/**