summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2009-08-03 10:34:53 -0400
committerRich Hickey <richhickey@gmail.com>2009-08-03 10:34:53 -0400
commitc87119b00b292a296a603a2af92333e70b48071e (patch)
tree4158b62c671a596864089ac425510b5b8046dcf9 /src
parente456322f0ae2bd16704887db0c0d42f93406b35d (diff)
fix commute after set
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/LockingTransaction.java12
1 files changed, 5 insertions, 7 deletions
diff --git a/src/jvm/clojure/lang/LockingTransaction.java b/src/jvm/clojure/lang/LockingTransaction.java
index 68d94640..bb61e1b6 100644
--- a/src/jvm/clojure/lang/LockingTransaction.java
+++ b/src/jvm/clojure/lang/LockingTransaction.java
@@ -272,6 +272,8 @@ Object run(Callable fn) throws Exception{
for(Map.Entry<Ref, ArrayList<CFn>> e : commutes.entrySet())
{
Ref ref = e.getKey();
+ if(sets.contains(ref)) continue;
+
boolean wasEnsured = ensures.contains(ref);
//can't upgrade readLock, so release it
releaseIfEnsured(ref);
@@ -287,8 +289,7 @@ Object run(Callable fn) throws Exception{
throw retryex;
}
Object val = ref.tvals == null ? null : ref.tvals.val;
- if(!sets.contains(ref))
- vals.put(ref, val);
+ vals.put(ref, val);
for(CFn f : e.getValue())
{
vals.put(ref, f.fn.applyTo(RT.cons(vals.get(ref), f.args)));
@@ -296,11 +297,8 @@ Object run(Callable fn) throws Exception{
}
for(Ref ref : sets)
{
- if(!commutes.containsKey(ref))
- {
- tryWriteLock(ref);
- locked.add(ref);
- }
+ tryWriteLock(ref);
+ locked.add(ref);
}
//validate and enqueue notifications