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);