diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-07-30 12:32:41 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-07-30 12:32:41 +0000 |
commit | 031971d1d80e1e2f6fbc50ac6a6afe81fcbc2e27 (patch) | |
tree | baf50e81fcf3e06d6e7d55e9525dd60292a78b0a /src | |
parent | d6160c83ed806f0c62a303b85421711357a9d2b7 (diff) |
notifyAll when barging
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/LockingTransaction.java | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/src/jvm/clojure/lang/LockingTransaction.java b/src/jvm/clojure/lang/LockingTransaction.java index fe0bbd3c..1f87fb44 100644 --- a/src/jvm/clojure/lang/LockingTransaction.java +++ b/src/jvm/clojure/lang/LockingTransaction.java @@ -76,13 +76,12 @@ void stop(int status){ Info info; -//long completedPriorPoint; long readPoint; long startPoint; -RetryException retryex = new RetryException(); -HashMap<Ref, Object> vals = new HashMap<Ref, Object>(); -HashSet<Ref> sets = new HashSet<Ref>(); -TreeMap<Ref, ArrayList<IFn>> commutes = new TreeMap<Ref, ArrayList<IFn>>(); +final RetryException retryex = new RetryException(); +final HashMap<Ref, Object> vals = new HashMap<Ref, Object>(); +final HashSet<Ref> sets = new HashSet<Ref>(); +final TreeMap<Ref, ArrayList<IFn>> commutes = new TreeMap<Ref, ArrayList<IFn>>(); void getReadPoint(){ readPoint = lastPoint.incrementAndGet(); @@ -102,10 +101,17 @@ Object lock(Ref ref) throws Exception{ if(refinfo != null && refinfo != info && refinfo.running()) { boolean barged = false; - //if this transaction is older, and could continue if it got the lock, + //if this transaction is older // try to abort the other if(info.startPoint < refinfo.startPoint) - barged = refinfo.status.compareAndSet(RUNNING, KILLED); + { + synchronized(refinfo) + { + barged = refinfo.status.compareAndSet(RUNNING, KILLED); + if(barged) + refinfo.notifyAll(); + } + } if(!barged) { ref.lock.writeLock().unlock(); |