Author: toad
Date: 2008-06-26 00:58:08 +0000 (Thu, 26 Jun 2008)
New Revision: 20732

Modified:
   
branches/db4o/freenet/src/freenet/client/async/MultiPutCompletionCallback.java
   branches/db4o/freenet/src/freenet/client/async/SingleFileInserter.java
Log:
MultiPutCompletionCallback: activation and database updating.

Modified: 
branches/db4o/freenet/src/freenet/client/async/MultiPutCompletionCallback.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/client/async/MultiPutCompletionCallback.java  
    2008-06-26 00:45:18 UTC (rev 20731)
+++ 
branches/db4o/freenet/src/freenet/client/async/MultiPutCompletionCallback.java  
    2008-06-26 00:58:08 UTC (rev 20732)
@@ -25,7 +25,15 @@
        private boolean finished;
        private boolean started;
        public final Object token;
+       private final boolean persistent;

+       public void objectOnActivate(ObjectContainer container) {
+               // Only activate the arrays
+               container.activate(waitingFor, 1);
+               container.activate(waitingForBlockSet, 1);
+               container.activate(waitingForFetchable, 1);
+       }
+       
        public MultiPutCompletionCallback(PutCompletionCallback cb, 
BaseClientPutter parent, Object token) {
                this.cb = cb;
                waitingFor = new Vector();
@@ -34,6 +42,7 @@
                this.parent = parent;
                this.token = token;
                finished = false;
+               this.persistent = parent.persistent();
        }

        public void onSuccess(ClientPutState state, ObjectContainer container, 
ClientContext context) {
@@ -59,6 +68,11 @@
                                return;
                        }
                }
+               if(persistent) {
+                       container.set(waitingFor);
+                       container.set(waitingForBlockSet);
+                       container.set(waitingForFetchable);
+               }
                complete(e, container, context);
        }

@@ -72,22 +86,33 @@
                        }
                        if(e == null) e = this.e;
                }
+               if(persistent) {
+                       container.set(this);
+                       container.activate(cb, 1);
+               }
                if(e != null)
                        cb.onFailure(e, this, container, context);
                else
                        cb.onSuccess(this, container, context);
        }

-       public synchronized void addURIGenerator(ClientPutState ps) {
-               add(ps);
+       public synchronized void addURIGenerator(ClientPutState ps, 
ObjectContainer container) {
+               add(ps, container);
                generator = ps;
+               if(persistent)
+                       container.set(this);
        }

-       public synchronized void add(ClientPutState ps) {
+       public synchronized void add(ClientPutState ps, ObjectContainer 
container) {
                if(finished) return;
                waitingFor.add(ps);
                waitingForBlockSet.add(ps);
                waitingForFetchable.add(ps);
+               if(persistent) {
+                       container.set(waitingFor);
+                       container.set(waitingForBlockSet);
+                       container.set(waitingForFetchable);
+               }
        }

        public void arm(ObjectContainer container, ClientContext context) {
@@ -98,7 +123,10 @@
                        allDone = waitingFor.isEmpty();
                        allGotBlocks = waitingForBlockSet.isEmpty();
                }
-
+               if(persistent) {
+                       container.set(this);
+                       container.activate(cb, 1);
+               }
                if(allGotBlocks) {
                        cb.onBlockSetFinished(this, container, context);
                }
@@ -115,6 +143,8 @@
                synchronized(this) {
                        if(state != generator) return;
                }
+               if(persistent)
+                       container.activate(cb, 1);
                cb.onEncode(key, this, container, context);
        }

@@ -123,8 +153,11 @@
                synchronized(this) {
                        states = (ClientPutState[]) waitingFor.toArray(states);
                }
-               for(int i=0;i<states.length;i++)
+               for(int i=0;i<states.length;i++) {
+                       if(persistent)
+                               container.activate(states[i], 1);
                        states[i].cancel(container, context);
+               }
        }

        public synchronized void onTransition(ClientPutState oldState, 
ClientPutState newState, ObjectContainer container) {
@@ -132,17 +165,28 @@
                        generator = newState;
                if(oldState == newState) return;
                for(int i=0;i<waitingFor.size();i++) {
-                       if(waitingFor.get(i) == oldState) waitingFor.set(i, 
newState);
+                       if(waitingFor.get(i) == oldState) {
+                               waitingFor.set(i, newState);
+                               container.set(waitingFor);
+                       }
                }
                for(int i=0;i<waitingFor.size();i++) {
-                       if(waitingForBlockSet.get(i) == oldState) 
waitingForBlockSet.set(i, newState);
+                       if(waitingForBlockSet.get(i) == oldState) {
+                               waitingForBlockSet.set(i, newState);
+                               container.set(waitingFor);
+                       }
                }
                for(int i=0;i<waitingFor.size();i++) {
-                       if(waitingForFetchable.get(i) == oldState) 
waitingForFetchable.set(i, newState);
+                       if(waitingForFetchable.get(i) == oldState) {
+                               waitingForFetchable.set(i, newState);
+                               container.set(waitingFor);
+                       }
                }
        }

        public synchronized void onMetadata(Metadata m, ClientPutState state, 
ObjectContainer container, ClientContext context) {
+               if(persistent)
+                       container.activate(cb, 1);
                if(generator == state) {
                        cb.onMetadata(m, this, container, context);
                } else {
@@ -153,9 +197,13 @@
        public void onBlockSetFinished(ClientPutState state, ObjectContainer 
container, ClientContext context) {
                synchronized(this) {
                        this.waitingForBlockSet.remove(state);
+                       if(persistent)
+                               container.set(waitingForBlockSet);
                        if(!started) return;
                        if(!waitingForBlockSet.isEmpty()) return;
                }
+               if(persistent)
+                       container.activate(cb, 1);
                cb.onBlockSetFinished(this, container, context);
        }

@@ -174,9 +222,13 @@
        public void onFetchable(ClientPutState state, ObjectContainer 
container) {
                synchronized(this) {
                        this.waitingForFetchable.remove(state);
+                       if(persistent)
+                               container.set(waitingForFetchable);
                        if(!started) return;
                        if(!waitingForFetchable.isEmpty()) return;
                }
+               if(persistent)
+                       container.activate(cb, 1);
                cb.onFetchable(this, container);
        }


Modified: branches/db4o/freenet/src/freenet/client/async/SingleFileInserter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SingleFileInserter.java      
2008-06-26 00:45:18 UTC (rev 20731)
+++ branches/db4o/freenet/src/freenet/client/async/SingleFileInserter.java      
2008-06-26 00:58:08 UTC (rev 20732)
@@ -223,8 +223,8 @@
                                        throw new 
InsertException(InsertException.INTERNAL_ERROR, "Got 
MetadataUnresolvedException in SingleFileInserter: "+e.toString(), null);
                                }
                                ClientPutState metaPutter = 
createInserter(parent, metadataBucket, (short) -1, block.desiredURI, ctx, mcb, 
true, (int)origSize, -1, getCHKOnly, true, false, container, context);
-                               mcb.addURIGenerator(metaPutter);
-                               mcb.add(dataPutter);
+                               mcb.addURIGenerator(metaPutter, container);
+                               mcb.add(dataPutter, container);
                                cb.onTransition(this, mcb, container);
                                Logger.minor(this, ""+mcb+" : data 
"+dataPutter+" meta "+metaPutter);
                                mcb.arm(container, context);


Reply via email to