[freenet-cvs] r16256 - trunk/freenet/src/freenet/client/async

toad at freenetproject.org toad at freenetproject.org
Tue Dec 4 13:48:56 UTC 2007


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() {




More information about the cvs mailing list