diff options
author | Rich Hickey <richhickey@gmail.com> | 2009-06-30 11:22:39 -0400 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2009-06-30 11:22:39 -0400 |
commit | 6201f5e2ddd52f1b483d75563b0380deba59777c (patch) | |
tree | bd7688bb8f124f6acadc26693a7afce1058e90e7 /src/jvm/clojure | |
parent | 5e34989a7098a55ca014030d7446d2dc20ebc33b (diff) |
added ref min/max history control - refs #138
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r-- | src/jvm/clojure/lang/LockingTransaction.java | 5 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Ref.java | 44 |
2 files changed, 48 insertions, 1 deletions
diff --git a/src/jvm/clojure/lang/LockingTransaction.java b/src/jvm/clojure/lang/LockingTransaction.java index 66a262e7..4976d169 100644 --- a/src/jvm/clojure/lang/LockingTransaction.java +++ b/src/jvm/clojure/lang/LockingTransaction.java @@ -281,11 +281,14 @@ Object run(Callable fn) throws Exception{ Ref ref = e.getKey(); Object oldval = ref.tvals == null ? null : ref.tvals.val; Object newval = e.getValue(); + int hcount = ref.histCount(); + if(ref.tvals == null) { ref.tvals = new Ref.TVal(newval, commitPoint, msecs); } - else if(ref.faults.get() > 0) + else if((ref.faults.get() > 0 && hcount < ref.maxHistory) + || hcount < ref.minHistory) { ref.tvals = new Ref.TVal(newval, commitPoint, msecs, ref.tvals); ref.faults.set(0); diff --git a/src/jvm/clojure/lang/Ref.java b/src/jvm/clojure/lang/Ref.java index 90faedcc..fef7c439 100644 --- a/src/jvm/clojure/lang/Ref.java +++ b/src/jvm/clojure/lang/Ref.java @@ -26,6 +26,24 @@ public class Ref extends ARef implements IFn, Comparable<Ref>, IRef{ return 1; } +public int getMinHistory(){ + return minHistory; +} + +public Ref setMinHistory(int minHistory){ + this.minHistory = minHistory; + return this; +} + +public int getMaxHistory(){ + return maxHistory; +} + +public Ref setMaxHistory(int maxHistory){ + this.maxHistory = maxHistory; + return this; +} + public static class TVal{ Object val; long point; @@ -60,6 +78,9 @@ LockingTransaction.Info tinfo; //IFn validator; final long id; +volatile int minHistory = 0; +volatile int maxHistory = 10; + static final AtomicLong ids = new AtomicLong(); public Ref(Object initVal) throws Exception{ @@ -187,6 +208,29 @@ public void trimHistory(){ } } +public int getHistoryCount(){ + try + { + lock.writeLock().lock(); + return histCount(); + } + finally + { + lock.writeLock().unlock(); + } +} + +int histCount(){ + if(tvals == null) + return 0; + else + { + int count = 0; + for(TVal tv = tvals.next;tv != tvals;tv = tv.next) + count++; + return count; + } +} final public IFn fn(){ return (IFn) deref(); |