summaryrefslogtreecommitdiff
path: root/src/jvm/clojure
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2009-06-30 11:22:39 -0400
committerRich Hickey <richhickey@gmail.com>2009-06-30 11:22:39 -0400
commit6201f5e2ddd52f1b483d75563b0380deba59777c (patch)
treebd7688bb8f124f6acadc26693a7afce1058e90e7 /src/jvm/clojure
parent5e34989a7098a55ca014030d7446d2dc20ebc33b (diff)
added ref min/max history control - refs #138
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r--src/jvm/clojure/lang/LockingTransaction.java5
-rw-r--r--src/jvm/clojure/lang/Ref.java44
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();