summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-10-20 17:44:18 +0000
committerRich Hickey <richhickey@gmail.com>2007-10-20 17:44:18 +0000
commite1261423aa9d01e8c4dc2a4518ed86e0ada0ccd3 (patch)
tree21d4378359db54ea1bdfdc596cae69a1e78fb8ba
parent7604b15a0efb6ed83fd377693af97d7726c944e6 (diff)
made non-inheritable thread local, added commuteRoot, sync on root sets
-rw-r--r--src/jvm/clojure/lang/Var.java25
1 files changed, 8 insertions, 17 deletions
diff --git a/src/jvm/clojure/lang/Var.java b/src/jvm/clojure/lang/Var.java
index 7e355c76..d17dbd84 100644
--- a/src/jvm/clojure/lang/Var.java
+++ b/src/jvm/clojure/lang/Var.java
@@ -37,27 +37,14 @@ static class Frame{
}
}
-static InheritableThreadLocal<Frame> dvals = new InheritableThreadLocal<Frame>(){
-
- protected Frame childValue(Frame parentValue){
- //increment the entire map since we will share it
- //note - allows communicating with parent via set() on initial bindings
- //must be paired with releaseThreadBindings() on thread termination
- //or else initial vars will have non-zero counts forever (inefficient, not fatal)
- for(ISeq bs = RT.keys(parentValue.bindings); bs != null; bs = bs.rest())
- {
- Var v = (Var) bs.first();
- v.count.incrementAndGet();
- }
- return new Frame(PersistentHashMap.EMPTY, parentValue.bindings, null);
- }
+static ThreadLocal<Frame> dvals = new ThreadLocal<Frame>(){
protected Frame initialValue(){
return new Frame();
}
};
-Object root;
+volatile Object root;
transient final AtomicInteger count;
final public Symbol sym;
boolean macroFlag = false;
@@ -171,15 +158,19 @@ final public boolean hasRoot(){
}
//binding root always clears macro flag
-public void bindRoot(Object root){
+synchronized public void bindRoot(Object root){
this.root = root;
macroFlag = false;
}
-public void unbindRoot(){
+synchronized public void unbindRoot(){
this.root = dvals;
}
+synchronized public void commuteRoot(IFn fn, Object root) throws Exception{
+ this.root = fn.invoke(root);
+}
+
public static void pushThreadBindings(Associative bindings){
Frame f = dvals.get();
Associative bmap = f.bindings;