diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-10-20 17:44:18 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-10-20 17:44:18 +0000 |
commit | e1261423aa9d01e8c4dc2a4518ed86e0ada0ccd3 (patch) | |
tree | 21d4378359db54ea1bdfdc596cae69a1e78fb8ba /src | |
parent | 7604b15a0efb6ed83fd377693af97d7726c944e6 (diff) |
made non-inheritable thread local, added commuteRoot, sync on root sets
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/Var.java | 25 |
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; |