summaryrefslogtreecommitdiff
path: root/src/cli/runtime/ThreadLocalData.cs
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2006-04-02 16:34:00 +0000
committerRich Hickey <richhickey@gmail.com>2006-04-02 16:34:00 +0000
commitab3658c3f102d470c146260c87d7ea34b365126f (patch)
tree25af35169d4be51c310372e6788ef4e05ea865c7 /src/cli/runtime/ThreadLocalData.cs
parentad76fd174341a19ec4b311c17d3c760637d81724 (diff)
Initial commit of CLI runtime
Diffstat (limited to 'src/cli/runtime/ThreadLocalData.cs')
-rw-r--r--src/cli/runtime/ThreadLocalData.cs86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/cli/runtime/ThreadLocalData.cs b/src/cli/runtime/ThreadLocalData.cs
new file mode 100644
index 00000000..0f41ecf8
--- /dev/null
+++ b/src/cli/runtime/ThreadLocalData.cs
@@ -0,0 +1,86 @@
+/**
+ * Copyright (c) Rich Hickey. All rights reserved.
+ * The use and distribution terms for this software are covered by the
+ * Common Public License 1.0 (http://opensource.org/licenses/cpl.php)
+ * which can be found in the file CPL.TXT at the root of this distribution.
+ * By using this software in any fashion, you are agreeing to be bound by
+ * the terms of this license.
+ * You must not remove this notice, or any other, from this software.
+ **/
+
+/* rich Mar 25, 2006 11:45:22 AM */
+
+using System;
+using System.Collections.Specialized;
+
+namespace org.clojure.runtime
+{
+public class ThreadLocalData{
+
+public const int MULTIPLE_VALUES_LIMIT = 20;
+public int mvCount = 0;
+public Object[] mvArray = new Object[MULTIPLE_VALUES_LIMIT];
+
+HybridDictionary dynamicBindings = new HybridDictionary();
+
+public Cons getDynamicBinding(Symbol sym)
+ {
+ return (Cons) dynamicBindings[sym];
+ }
+
+public Cons pushDynamicBinding(Symbol sym, Object val)
+ {
+ Cons ret = new Cons(val, getDynamicBinding(sym));
+ dynamicBindings[sym] = ret;
+ return ret;
+ }
+
+
+public Cons popDynamicBinding(Symbol sym)
+ {
+ Cons ret = (Cons) getDynamicBinding(sym).rest;
+ dynamicBindings[sym] = ret;
+ return ret;
+ }
+
+public ThreadLocalData(HybridDictionary dynamicBindings)
+ {
+ this.mvCount = 0;
+ this.mvArray = new Object[MULTIPLE_VALUES_LIMIT];
+ this.dynamicBindings = dynamicBindings;
+ }
+
+public ThreadLocalData():
+ this(new HybridDictionary())
+ {
+ }
+
+public static ThreadLocalData get()
+ {
+ if(tld == null)
+ tld = new ThreadLocalData();
+ return tld;
+ }
+
+/*
+note this is not the same semantics as InheritableThreadLocal - aargh
+might need to make Java side non-inheritable
+*/
+[ThreadStatic]
+ static ThreadLocalData tld;
+ /* was this in Java
+static InheritableThreadLocal tld = new InheritableThreadLocal(){
+ protected Object childValue(Object object)
+ {
+ return new ThreadLocalData((HybridDictionary) ((ThreadLocalData) object).dynamicBindings.clone());
+ }
+
+ protected Object initialValue()
+ {
+ return new ThreadLocalData();
+ }
+};
+*/
+
+}
+}