From 59ab35b1ff2675d7ef92e8c112efedba5197d52d Mon Sep 17 00:00:00 2001
From: Christophe Grand <christophe@cgrand.net>
Date: Mon, 3 Aug 2009 11:40:58 +0200
Subject: [PATCH] fixes commute after set

---
 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 4976d16..a067987 100644
--- a/src/jvm/clojure/lang/LockingTransaction.java
+++ b/src/jvm/clojure/lang/LockingTransaction.java
@@ -240,6 +240,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;
+
 					ref.lock.writeLock().lock();
 					locked.add(ref);
 					Info refinfo = ref.tinfo;
@@ -249,8 +251,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)));
@@ -258,11 +259,8 @@ Object run(Callable fn) throws Exception{
 					}
 				for(Ref ref : sets)
 					{
-					if(!commutes.containsKey(ref))
-						{
-						ref.lock.writeLock().lock();
-						locked.add(ref);
-						}
+					ref.lock.writeLock().lock();
+					locked.add(ref);
 					}
 
 				//validate and enqueue notifications
-- 
1.6.3.2.1299.gee46c

