summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-07-30 12:32:41 +0000
committerRich Hickey <richhickey@gmail.com>2007-07-30 12:32:41 +0000
commit031971d1d80e1e2f6fbc50ac6a6afe81fcbc2e27 (patch)
treebaf50e81fcf3e06d6e7d55e9525dd60292a78b0a /src
parentd6160c83ed806f0c62a303b85421711357a9d2b7 (diff)
notifyAll when barging
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/LockingTransaction.java20
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();