diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-05-16 13:59:59 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-05-16 13:59:59 +0000 |
commit | 660f36af98afeb3c5c05a1ec7b3657a324abebba (patch) | |
tree | 1055524256172c0c958fd71a3180de5cccac0bde | |
parent | f8b016d9ec69264d3de42e20c92c1884db891339 (diff) |
switched to re-dispatching of actions sent during transactions
-rw-r--r-- | src/jvm/clojure/lang/Agent.java | 10 | ||||
-rw-r--r-- | src/jvm/clojure/lang/LockingTransaction.java | 15 |
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) |