diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-06-26 00:56:43 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-06-26 00:56:43 +0000 |
commit | bbe9d7ace49db4e368443818220e5268c3e3a367 (patch) | |
tree | 26e34442d001b55c33a41b9e9473d26dec465ae4 /src/jvm/clojure | |
parent | 2f727ab53baa48fded8f8735484c8b7cddf7b95b (diff) |
interim checkin
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r-- | src/jvm/clojure/lang/Module.java | 72 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Symbol.java | 70 | ||||
-rw-r--r-- | src/jvm/clojure/lang/TRef.java | 27 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Transaction.java | 26 |
4 files changed, 97 insertions, 98 deletions
diff --git a/src/jvm/clojure/lang/Module.java b/src/jvm/clojure/lang/Module.java index e93cd666..c33e57a5 100644 --- a/src/jvm/clojure/lang/Module.java +++ b/src/jvm/clojure/lang/Module.java @@ -15,62 +15,50 @@ package clojure.lang; import java.util.HashMap; import java.util.IdentityHashMap; -public class Module { +public class Module{ /** - * String->Namespace + * String->Module */ -static final public HashMap table = new HashMap(); +static final public TRef<IPersistentMap> table = new TRef(PersistentHashMap.EMPTY); /** * Symbol->Var */ -final public IdentityHashMap vars = new IdentityHashMap(); +final public TRef<IPersistentMap> vars = new TRef(PersistentHashMap.EMPTY); final public String name; -Module(String name) - { - this.name = name; - table.put(name, this); - } +Module(String name){ + this.name = name; +} -static public Module find(String name) - { - return (Module) table.get(name); - } +static public Module find(String name) throws Exception{ + return (Module) table.get().get(name); +} -static public Module findOrCreate(String name) - { - synchronized(table) - { - Module ns = find(name); - if(ns == null) - table.put(name,ns = new Module(name)); - return ns; - } - } +static public Module findOrCreate(String name) throws Exception{ + //must be called in transaction + Module ns = find(name); + if(ns == null) + table.set(table.get().assoc(name, ns = new Module(name))); + return ns; +} -static public Var intern(String ns,String name) - { - return findOrCreate(ns).intern(new Symbol(name)); - } +static public Var intern(String ns, String name) throws Exception{ + return findOrCreate(ns).intern(new Symbol(name)); +} -public Var find(Symbol sym){ - synchronized(vars) - { - return (Var) vars.get(sym); - } +public Var find(Symbol sym) throws Exception{ + return (Var) vars.get().get(sym); } -public Var intern(Symbol sym) - { - synchronized(vars) - { - Var var = (Var) vars.get(sym); - if(var == null) - vars.put(sym, var = new Var(sym, this)); - return var; - } - } +public Var intern(Symbol sym) throws Exception{ + //must be called in transaction + IPersistentMap varmap = vars.get(); + Var var = (Var) varmap.get(sym); + if(var == null) + vars.set(varmap.assoc(sym, var = new Var(sym, this))); + return var; +} } diff --git a/src/jvm/clojure/lang/Symbol.java b/src/jvm/clojure/lang/Symbol.java index 918d3ec3..b9c7ffe9 100644 --- a/src/jvm/clojure/lang/Symbol.java +++ b/src/jvm/clojure/lang/Symbol.java @@ -13,25 +13,22 @@ package clojure.lang; -public class Symbol -{ +public class Symbol{ //this must be an interned string! public final String name; -public String toString() - { - return name; - } +public String toString(){ + return name; +} -public Symbol(String name) - { - this.name = name.intern(); - } +Symbol(String name){ + this.name = name.intern(); +} public boolean equals(Object o){ if(this == o) return true; - if(o == null || getClass() != o.getClass()) + if(o == null || !(o instanceof Symbol)) return false; Symbol symbol = (Symbol) o; @@ -44,36 +41,25 @@ public int hashCode(){ return name.hashCode(); } -/* -public static Symbol intern(String name) - { - synchronized(table) - { - Symbol sym = (Symbol) table.get(name); - int dot = 0; - if(sym == null) - { - if(name.charAt(0) == ':') - sym = new Keyword(name); - else if((dot = name.indexOf('.')) != -1) - { - if(dot == 0) - sym = new InstanceMemberSymbol(name); - else if(name.lastIndexOf('.') == name.length() - 1) - sym = new ClassSymbol(name); - else - sym = new StaticMemberSymbol(name); - } - else - sym = new Symbol(name); - if(table.get(name) != null) //defend against recursive static init - return (Symbol) table.get(name); - table.put(name, sym); - } - return sym; - } - } - +//* +public static Symbol intern(String name){ + int dot = 0; + Symbol sym; + if(name.charAt(0) == ':') + sym = new Keyword(name); + else if((dot = name.indexOf('.')) != -1) + { + if(dot == 0) + sym = new InstanceMemberSymbol(name); + else if(name.lastIndexOf('.') == name.length() - 1) + sym = new ClassSymbol(name); + else + sym = new StaticMemberSymbol(name); + } + else + sym = new Symbol(name); + return sym; +} - */ +//*/ } diff --git a/src/jvm/clojure/lang/TRef.java b/src/jvm/clojure/lang/TRef.java index d750e434..6f246cb2 100644 --- a/src/jvm/clojure/lang/TRef.java +++ b/src/jvm/clojure/lang/TRef.java @@ -14,7 +14,7 @@ package clojure.lang; import java.util.concurrent.atomic.AtomicReference; -public class TRef{ +public class TRef<T>{ //reference to a chain of TVals, only the head of which may be non-committed final AtomicReference<TVal> tvals; @@ -22,18 +22,37 @@ public TRef() { this.tvals = new AtomicReference<TVal>(); } -public TRef(Object initVal) { +public TRef(T initVal) { this.tvals = new AtomicReference<TVal>(); tvals.set(new TVal(initVal, Transaction.ZERO_POINT, null)); } -public Object getCurrentVal(){ +public T getCurrentVal(){ TVal current = getCurrentTVal(); if(current != null) - return current.val; + return (T)current.val; return null; } +public T get() throws Exception{ + Transaction t = Transaction.get(); + if(t != null) + return (T) t.doGet(this); + return getCurrentVal(); +} + +public T set(T val) throws Exception{ + return (T) Transaction.getEx().doSet(this,val); +} + +public T commute(T val,IFn fn) throws Exception{ + return (T) Transaction.getEx().doCommute(this,fn); +} + +public void touch() throws Exception{ + Transaction.getEx().doTouch(this); +} + TVal getCurrentTVal(){ TVal head = tvals.get(); if(head == null || head.tstamp.status == TStamp.Status.COMMITTED) diff --git a/src/jvm/clojure/lang/Transaction.java b/src/jvm/clojure/lang/Transaction.java index fa71871f..d81037d2 100644 --- a/src/jvm/clojure/lang/Transaction.java +++ b/src/jvm/clojure/lang/Transaction.java @@ -17,7 +17,6 @@ import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; import java.util.concurrent.*; import java.util.ArrayList; import java.util.List; -import java.util.Iterator; import java.util.Collections; public class Transaction{ @@ -130,16 +129,23 @@ void abort() throws AbortException{ throw new AbortException(); } -static Transaction getTransaction(){ +static Transaction get(){ return transaction.get(); } +static Transaction getEx() throws Exception{ + Transaction t = transaction.get(); + if(t == null) + throw new Exception("No transaction running"); + return t; +} + static void setTransaction(Transaction t){ transaction.set(t); } static public Object runInTransaction(IFn fn) throws Exception{ - if(getTransaction() != null) + if(get() != null) return fn.invoke(); Transaction t = new Transaction(); @@ -240,15 +246,15 @@ void doTouch(TRef tref) throws Exception{ lock(tref, true); } -void doCommute(TRef tref, IFn fn) throws Exception{ +Object doCommute(TRef tref, IFn fn) throws Exception{ TVal head = lock(tref, false); - head.val = fn.invoke(head.val); + return head.val = fn.invoke(head.val); } /* static public Object runInAsOfTransaction(IFn fn, int tpoint) throws Exception{ - if(getTransaction() != null) + if(get() != null) throw new Exception("As-of transactions cannot be nested"); Transaction t = new Transaction(tpoint); @@ -264,7 +270,7 @@ static public Object runInAsOfTransaction(IFn fn, int tpoint) throws Exception{ } static public Object runInAsOfTransaction(IFn fn, long msecs) throws Exception{ - if(getTransaction() != null) + if(get() != null) throw new Exception("As-of transactions cannot be nested"); Transaction t = new Transaction(msecs); @@ -348,7 +354,7 @@ public static void main(String[] args){ public Object invoke() throws Exception{ for(TRef tref : items) { - Transaction.getTransaction().doCommute(tref, incr); + Transaction.get().doCommute(tref, incr); } return null; } @@ -379,8 +385,8 @@ public static void main(String[] args){ public Object invoke() throws Exception{ for(TRef tref : items) { - //Transaction.getTransaction().doTouch(tref); - Transaction t = Transaction.getTransaction(); + //Transaction.get().doTouch(tref); + Transaction t = Transaction.get(); int val = (Integer) t.doGet(tref); t.doSet(tref, val + 1); } |