Author: toad
Date: 2006-11-12 03:57:31 +0000 (Sun, 12 Nov 2006)
New Revision: 10901

Modified:
   trunk/freenet/src/freenet/client/async/ClientGetter.java
   trunk/freenet/src/freenet/client/async/USKFetcher.java
   trunk/freenet/src/freenet/client/async/USKInserter.java
Log:
Fix deadlock.

Modified: trunk/freenet/src/freenet/client/async/ClientGetter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientGetter.java    2006-11-12 
03:44:31 UTC (rev 10900)
+++ trunk/freenet/src/freenet/client/async/ClientGetter.java    2006-11-12 
03:57:31 UTC (rev 10901)
@@ -71,6 +71,7 @@
                                        currentState = null;
                                        cancelled = false;
                                }
+                               // Possibility for deadlock?
                                currentState = SingleFileFetcher.create(this, 
this, new ClientMetadata(),
                                                uri, ctx, actx, 
ctx.maxNonSplitfileRetries, 0, false, null, true,
                                                returnBucket, true);

Modified: trunk/freenet/src/freenet/client/async/USKFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKFetcher.java      2006-11-12 
03:44:31 UTC (rev 10900)
+++ trunk/freenet/src/freenet/client/async/USKFetcher.java      2006-11-12 
03:57:31 UTC (rev 10901)
@@ -335,18 +335,17 @@
                                }
                        }
                        cancelBefore(curLatest);
-
-                       if(l == null) return;
-                       // If we schedule them here, we don't get icky 
recursion problems.
-                       else if(!cancelled) {
-                               for(Iterator i=l.iterator();i.hasNext();) {
-                                       // We may be called recursively through 
onSuccess().
-                                       // So don't start obsolete requests.
-                                       USKAttempt a = (USKAttempt) i.next();
-                                       lastEd = uskManager.lookup(origUSK);
-                                       if((lastEd <= a.number) && !a.cancelled)
-                                               a.schedule();
-                               }
+               }
+               if(l == null) return;
+               // If we schedule them here, we don't get icky recursion 
problems.
+               else if(!cancelled) {
+                       for(Iterator i=l.iterator();i.hasNext();) {
+                               // We may be called recursively through 
onSuccess().
+                               // So don't start obsolete requests.
+                               USKAttempt a = (USKAttempt) i.next();
+                               lastEd = uskManager.lookup(origUSK);
+                               if((lastEd <= a.number) && !a.cancelled)
+                                       a.schedule();
                        }
                }
        }
@@ -435,7 +434,8 @@
                                add(i);
                        attempts = (USKAttempt[]) runningAttempts.toArray(new 
USKAttempt[runningAttempts.size()]);
                        started = true;
-               if(!cancelled)
+               }
+               if(!cancelled) {
                        for(int i=0;i<attempts.length;i++) {
                                // Race conditions happen here and waste a lot 
more time than this simple check.
                                long lastEd = uskManager.lookup(origUSK);

Modified: trunk/freenet/src/freenet/client/async/USKInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKInserter.java     2006-11-12 
03:44:31 UTC (rev 10900)
+++ trunk/freenet/src/freenet/client/async/USKInserter.java     2006-11-12 
03:57:31 UTC (rev 10901)
@@ -102,14 +102,16 @@
                scheduleInsert();
        }

-       private synchronized void scheduleInsert() {
+       private void scheduleInsert() {
                long edNo = Math.max(edition, ctx.uskManager.lookup(pubUSK))+1;
-               if(finished) return;
-               edition = edNo;
-               if(Logger.shouldLog(Logger.MINOR, this))
-                       Logger.minor(this, "scheduling insert for 
"+pubUSK.getURI()+" "+edition);
-               sbi = new SingleBlockInserter(parent, data, compressionCodec, 
privUSK.getInsertableSSK(edition).getInsertURI(),
-                               ctx, this, isMetadata, sourceLength, token, 
getCHKOnly, false, true /* we don't use it */, tokenObject);
+               synchronized(this) {
+                       if(finished) return;
+                       edition = edNo;
+                       if(Logger.shouldLog(Logger.MINOR, this))
+                               Logger.minor(this, "scheduling insert for 
"+pubUSK.getURI()+" "+edition);
+                       sbi = new SingleBlockInserter(parent, data, 
compressionCodec, privUSK.getInsertableSSK(edition).getInsertURI(),
+                                       ctx, this, isMetadata, sourceLength, 
token, getCHKOnly, false, true /* we don't use it */, tokenObject);
+               }
                try {
                        sbi.schedule();
                } catch (InserterException e) {


Reply via email to