diff options
author | Rich Hickey <richhickey@gmail.com> | 2009-08-03 10:34:53 -0400 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2009-08-03 10:34:53 -0400 |
commit | c87119b00b292a296a603a2af92333e70b48071e (patch) | |
tree | 4158b62c671a596864089ac425510b5b8046dcf9 /src | |
parent | e456322f0ae2bd16704887db0c0d42f93406b35d (diff) |
fix commute after set
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/LockingTransaction.java | 12 |
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 |