summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-05-16 13:59:59 +0000
committerRich Hickey <richhickey@gmail.com>2008-05-16 13:59:59 +0000
commit660f36af98afeb3c5c05a1ec7b3657a324abebba (patch)
tree1055524256172c0c958fd71a3180de5cccac0bde
parentf8b016d9ec69264d3de42e20c92c1884db891339 (diff)
switched to re-dispatching of actions sent during transactions
-rw-r--r--src/jvm/clojure/lang/Agent.java10
-rw-r--r--src/jvm/clojure/lang/LockingTransaction.java15
2 files changed, 17 insertions, 8 deletions
diff --git a/src/jvm/clojure/lang/Agent.java b/src/jvm/clojure/lang/Agent.java
index 5a07555c..c4f48535 100644
--- a/src/jvm/clojure/lang/Agent.java
+++ b/src/jvm/clojure/lang/Agent.java
@@ -132,6 +132,12 @@ public Object dispatch(IFn fn, ISeq args, boolean solo) throws Exception{
throw new Exception("Agent has errors", (Exception) RT.first(errors));
}
Action action = new Action(this, fn, args, solo);
+ dispatchAction(action);
+
+ return this;
+}
+
+static void dispatchAction(Action action){
LockingTransaction trans = LockingTransaction.getRunning();
if(trans != null)
trans.enqueue(action);
@@ -140,9 +146,7 @@ public Object dispatch(IFn fn, ISeq args, boolean solo) throws Exception{
nested.set(nested.get().cons(action));
}
else
- enqueue(action);
-
- return this;
+ action.agent.enqueue(action);
}
void enqueue(Action action){
diff --git a/src/jvm/clojure/lang/LockingTransaction.java b/src/jvm/clojure/lang/LockingTransaction.java
index f42ada7a..837187d7 100644
--- a/src/jvm/clojure/lang/LockingTransaction.java
+++ b/src/jvm/clojure/lang/LockingTransaction.java
@@ -87,7 +87,7 @@ void stop(int status){
vals.clear();
sets.clear();
commutes.clear();
- actions.clear();
+ //actions.clear();
}
}
@@ -270,10 +270,7 @@ Object run(IFn fn) throws Exception{
ref.tvals.msecs = msecs;
}
}
- for(Agent.Action action : actions)
- {
- action.agent.enqueue(action);
- }
+
done = true;
info.status.set(COMMITTED);
}
@@ -290,6 +287,14 @@ Object run(IFn fn) throws Exception{
}
locked.clear();
stop(done ? COMMITTED : RETRY);
+ if(done) //re-dispatch out of transaction
+ {
+ for(Agent.Action action : actions)
+ {
+ Agent.dispatchAction(action);
+ }
+ }
+ actions.clear();
}
}
if(!done)