Author: toad
Date: 2008-06-18 17:39:39 +0000 (Wed, 18 Jun 2008)
New Revision: 20437

Modified:
   branches/db4o/freenet/src/freenet/client/async/USKFetcherTag.java
   branches/db4o/freenet/src/freenet/client/async/USKManagerPersistent.java
Log:
USKFetcherTag's: don't restart on startup if already finished

Modified: branches/db4o/freenet/src/freenet/client/async/USKFetcherTag.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/USKFetcherTag.java   
2008-06-18 17:33:07 UTC (rev 20436)
+++ branches/db4o/freenet/src/freenet/client/async/USKFetcherTag.java   
2008-06-18 17:39:39 UTC (rev 20437)
@@ -5,6 +5,7 @@
 import freenet.client.FetchContext;
 import freenet.keys.USK;
 import freenet.node.RequestClient;
+import freenet.support.Logger;
 import freenet.support.io.NativeThread;

 /**
@@ -34,6 +35,7 @@
        private transient USKFetcher fetcher;
        private short pollingPriorityNormal;
        private short pollingPriorityProgress;
+       private boolean finished;

        private USKFetcherTag(USK origUSK, USKFetcherCallback callback, long 
nodeDBHandle, boolean persistent, ObjectContainer container, FetchContext ctx, 
boolean keepLastData, long token) {
                this.nodeDBHandle = nodeDBHandle;
@@ -93,8 +95,24 @@

        public void cancel(ObjectContainer container, ClientContext context) {
                if(fetcher != null) fetcher.cancel(container, context);
+               finish(context);
        }

+       private void finish(ClientContext context) {
+               synchronized(this) {
+                       finished = true;
+               }
+               if(persistent) {
+                       context.jobRunner.queue(new DBJob() {
+
+                               public void run(ObjectContainer container, 
ClientContext context) {
+                                       container.set(USKFetcherTag.this);
+                               }
+                               
+                       }, NativeThread.HIGH_PRIORITY, false);
+               }
+       }
+
        public long getToken() {
                return token;
        }
@@ -104,11 +122,15 @@
        }

        public void onCancelled(ObjectContainer container, ClientContext 
context) {
+               synchronized(this) {
+                       finished = true;
+               }
                if(persistent) {
                        context.jobRunner.queue(new DBJob() {

                                public void run(ObjectContainer container, 
ClientContext context) {
                                        callback.onCancelled(container, 
context);
+                                       container.set(this);
                                }

                        }, NativeThread.HIGH_PRIORITY, false);
@@ -118,11 +140,15 @@
        }

        public void onFailure(ObjectContainer container, ClientContext context) 
{
+               synchronized(this) {
+                       finished = true;
+               }
                if(persistent) {
                        context.jobRunner.queue(new DBJob() {

                                public void run(ObjectContainer container, 
ClientContext context) {
                                        callback.onFailure(container, context);
+                                       container.set(this);
                                }

                        }, NativeThread.HIGH_PRIORITY, false);
@@ -140,11 +166,19 @@
        }

        public void onFoundEdition(final long l, final USK key, ObjectContainer 
container, ClientContext context, final boolean metadata, final short codec, 
final byte[] data) {
+               synchronized(this) {
+                       if(fetcher == null) {
+                               Logger.error(this, "onFoundEdition but fetcher 
is null - isn't onFoundEdition() terminal for USKFetcherCallback's??", new 
Exception("debug"));
+                       }
+                       finished = true;
+                       fetcher = null;
+               }
                if(persistent) {
                        context.jobRunner.queue(new DBJob() {

                                public void run(ObjectContainer container, 
ClientContext context) {
                                        callback.onFoundEdition(l, key, 
container, context, metadata, codec, data);
+                                       container.set(this);
                                }

                        }, NativeThread.HIGH_PRIORITY, false);
@@ -156,5 +190,9 @@
        public void removeFromDatabase(ObjectContainer container) {
                container.delete(this);
        }
+
+       public final boolean isFinished() {
+               return finished;
+       }

 }

Modified: 
branches/db4o/freenet/src/freenet/client/async/USKManagerPersistent.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/USKManagerPersistent.java    
2008-06-18 17:33:07 UTC (rev 20436)
+++ branches/db4o/freenet/src/freenet/client/async/USKManagerPersistent.java    
2008-06-18 17:39:39 UTC (rev 20437)
@@ -14,7 +14,9 @@
        static void init(USKManager manager, ObjectContainer container, final 
ClientContext context) {
                ObjectSet set = container.query(new Predicate() {
                        public boolean match(USKFetcherTag tag) {
-                               return tag.nodeDBHandle == context.nodeDBHandle;
+                               if(tag.nodeDBHandle != context.nodeDBHandle) 
return false;
+                               if(tag.isFinished()) return false;
+                               return true;
                        }
                });
                while(set.hasNext()) {


Reply via email to