summaryrefslogtreecommitdiff
path: root/src/jvm/clojure
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-06-26 00:56:43 +0000
committerRich Hickey <richhickey@gmail.com>2007-06-26 00:56:43 +0000
commitbbe9d7ace49db4e368443818220e5268c3e3a367 (patch)
tree26e34442d001b55c33a41b9e9473d26dec465ae4 /src/jvm/clojure
parent2f727ab53baa48fded8f8735484c8b7cddf7b95b (diff)
interim checkin
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r--src/jvm/clojure/lang/Module.java72
-rw-r--r--src/jvm/clojure/lang/Symbol.java70
-rw-r--r--src/jvm/clojure/lang/TRef.java27
-rw-r--r--src/jvm/clojure/lang/Transaction.java26
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);
}