Author: toad
Date: 2007-12-04 13:48:55 +0000 (Tue, 04 Dec 2007)
New Revision: 16256

Modified:
   trunk/freenet/src/freenet/client/async/USKInserter.java
Log:
Don't hold the lock while calling the callbacks.

Modified: trunk/freenet/src/freenet/client/async/USKInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKInserter.java     2007-12-04 
13:16:34 UTC (rev 16255)
+++ trunk/freenet/src/freenet/client/async/USKInserter.java     2007-12-04 
13:48:55 UTC (rev 16256)
@@ -79,31 +79,40 @@
                fetcher.schedule();
        }

-       public synchronized void onFoundEdition(long l, USK key) {
-               edition = Math.max(l, edition);
-               consecutiveCollisions = 0;
-               if((fetcher.lastContentWasMetadata() == isMetadata) && 
fetcher.hasLastData()
-                               && (fetcher.lastCompressionCodec() == 
compressionCodec)) {
-                       try {
-                               byte[] myData = BucketTools.toByteArray(data);
-                               byte[] hisData = 
BucketTools.toByteArray(fetcher.getLastData());
-                               fetcher.freeLastData();
-                               if(Arrays.equals(myData, hisData)) {
-                                       // Success!
-                                       cb.onEncode(pubUSK.copy(edition), this);
-                                       parent.addMustSucceedBlocks(1);
-                                       parent.completedBlock(true);
-                                       cb.onSuccess(this);
-                                       finished = true;
-                                       sbi = null;
-                                       return;
+       public void onFoundEdition(long l, USK key) {
+               boolean alreadyInserted = false;
+               synchronized(this) {
+                       edition = Math.max(l, edition);
+                       consecutiveCollisions = 0;
+                       if((fetcher.lastContentWasMetadata() == isMetadata) && 
fetcher.hasLastData()
+                                       && (fetcher.lastCompressionCodec() == 
compressionCodec)) {
+                               try {
+                                       byte[] myData = 
BucketTools.toByteArray(data);
+                                       byte[] hisData = 
BucketTools.toByteArray(fetcher.getLastData());
+                                       fetcher.freeLastData();
+                                       if(Arrays.equals(myData, hisData)) {
+                                               // Success
+                                               alreadyInserted = true;
+                                               finished = true;
+                                               sbi = null;
+                                       }
+                               } catch (IOException e) {
+                                       Logger.error(this, "Could not decode: 
"+e, e);
                                }
-                       } catch (IOException e) {
-                               Logger.error(this, "Could not decode: "+e, e);
                        }
+                       if(!alreadyInserted) {
+                               fetcher = null;
+                       }
                }
-               fetcher = null;
-               scheduleInsert();
+               if(alreadyInserted) {
+                       // Success!
+                       cb.onEncode(pubUSK.copy(edition), this);
+                       parent.addMustSucceedBlocks(1);
+                       parent.completedBlock(true);
+                       cb.onSuccess(this);
+               } else {
+                       scheduleInsert();
+               }
        }

        private void scheduleInsert() {


Reply via email to