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();
        }

        /**


Reply via email to