r27098 - trunk/freenet/src/freenet/support

[email protected] Mon, 20 Apr 2009 14:52:15 +0000
Newsgroups gmane.network.freenet.cvs
Message-ID <[email protected]>
Author: xor
Date: 2009-04-20 14:52:14 +0000 (Mon, 20 Apr 2009)
New Revision: 27098

Modified:
   trunk/freenet/src/freenet/support/TransferThread.java
Log:
Fix bug #0002993.
While I'm at it, also clean up the logging a bit and add some javadoc.

Modified: trunk/freenet/src/freenet/support/TransferThread.java
===================================================================
--- trunk/freenet/src/freenet/support/TransferThread.java	2009-04-20 13:14:58 UTC (rev 27097)
+++ trunk/freenet/src/freenet/support/TransferThread.java	2009-04-20 14:52:14 UTC (rev 27098)
@@ -4,7 +4,6 @@
 package freenet.support;
 
 import java.util.Collection;
-import java.util.Iterator;
 
 import com.db4o.ObjectContainer;
 
@@ -52,7 +51,7 @@
 	
 	protected void start() {
 		mNode.executor.execute(this, mName);
-		Logger.debug(this, this.getClass().getSimpleName() + " started.");
+		Logger.debug(this, "Started.");
 	}
 	
 	/** Specify the priority of this thread. Priorities to return can be found in class NativeThread. */
@@ -112,28 +111,38 @@
 	}
 	
 	protected void abortAllTransfers() {
-		Logger.debug(this, "Trying to stop all requests & inserts");
+		Logger.debug(this, "Trying to stop all fetches & inserts...");
 		
 		abortFetches();
 		abortInserts();
 	}
 	
 	protected void abortFetches() {
-		Logger.debug(this, "Trying to stop all fetches");
+		Logger.debug(this, "Trying to stop all fetches...");
 		if(mFetches != null) synchronized(mFetches) {
-			Iterator<ClientGetter> r = mFetches.iterator();
-			int rcounter = 0;
-			while (r.hasNext()) { r.next().cancel(null, mNode.clientCore.clientContext); r.remove(); ++rcounter; }
-			Logger.debug(this, "Stopped " + rcounter + " current requests");
+			ClientGetter[] fetches = mFetches.toArray(new ClientGetter[mFetches.size()]);
+			int fcounter = 0;
+			for(ClientGetter fetch : fetches) {
+				/* This calls onFailure which removes the fetch from mFetches on the same thread, therefore we need to copy to an array */
+				fetch.cancel(null, mNode.clientCore.clientContext);
+				++fcounter;
+			}
+			
+			Logger.debug(this, "Stopped " + fcounter + " current fetches.");
 		}
 	}
 	
 	protected void abortInserts() {
+		Logger.debug(this, "Trying to stop all inserts...");
 		if(mInserts != null) synchronized(mInserts) {
-			Iterator<BaseClientPutter> i = mInserts.iterator();
+			BaseClientPutter[] inserts = mInserts.toArray(new BaseClientPutter[mInserts.size()]);
 			int icounter = 0;
-			while (i.hasNext()) { i.next().cancel(null, mNode.clientCore.clientContext); i.remove(); ++icounter; }
-			Logger.debug(this, "Stopped " + icounter + " current inserts");
+			for(BaseClientPutter insert : inserts) {
+				/* This calls onFailure which removes the fetch from mFetches on the same thread, therefore we need to copy to an array */
+				insert.cancel(null, mNode.clientCore.clientContext);
+				++icounter;
+			}
+			Logger.debug(this, "Stopped " + icounter + " current inserts.");
 		}
 	}
 	
@@ -145,7 +154,6 @@
 	
 	protected void removeFetch(ClientGetter g) {
 		synchronized(mFetches) {
-			//g.cancel(); /* FIXME: is this necessary ? */
 			mFetches.remove(g);
 		}
 		Logger.debug(this, "Removed request for " + g.getURI());
@@ -159,7 +167,6 @@
 	
 	protected void removeInsert(BaseClientPutter p) {
 		synchronized(mInserts) {
-			//p.cancel(); /* FIXME: is this necessary ? */
 			mInserts.remove(p);
 		}
 		Logger.debug(this, "Removed insert for " + p.getURI());
@@ -212,14 +219,26 @@
 	
 	/* Fetches */
 	
+	/**
+	 * You have to do "finally { removeFetch() }" when using this function.
+	 */
 	public abstract void onSuccess(FetchResult result, ClientGetter state, ObjectContainer container);
 
+	/**
+	 * You have to do "finally { removeFetch() }" when using this function.
+	 */
 	public abstract void onFailure(FetchException e, ClientGetter state, ObjectContainer container);
 
 	/* Inserts */
 	
+	/**
+	 * You have to do "finally { removeInsert() }" when using this function.
+	 */
 	public abstract void onSuccess(BaseClientPutter state, ObjectContainer container);
 
+	/**
+	 * You have to do "finally { removeInsert() }" when using this function.
+	 */
 	public abstract void onFailure(InsertException e, BaseClientPutter state, ObjectContainer container);
 
 	public abstract void onFetchable(BaseClientPutter state, ObjectContainer container);