summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cli/runtime/PerisistentArrayList.cs8
-rw-r--r--src/cli/runtime/PersistentArray.cs19
2 files changed, 13 insertions, 14 deletions
diff --git a/src/cli/runtime/PerisistentArrayList.cs b/src/cli/runtime/PerisistentArrayList.cs
index f22dd334..9c27932d 100644
--- a/src/cli/runtime/PerisistentArrayList.cs
+++ b/src/cli/runtime/PerisistentArrayList.cs
@@ -9,7 +9,6 @@
**/
using System;
-using System.Threading;
using System.Collections;
namespace clojure.lang
@@ -48,7 +47,7 @@ override public IPersistentArray assocN(int i,Object val) {
if(i >= _count)
throw new IndexOutOfRangeException();
- return (PersistentArrayList) base.assocN(i, val);
+ return base.assocN(i, val);
}
override public int length(){
@@ -92,13 +91,12 @@ private void grow() {
if(data.master.next != null) //this master has been trimmed, but this rev is not yet propagated
trim();
- Master newMaster = new Master(data.master.array.Length * 2, data.master.defaultVal, data.master.loadFactor);
+ Master newMaster = new Master(data.master.array.Length * 2, data.master.defaultVal, data.master.loadFactor, data.master.basis);
newMaster.rev = data.master.rev;
newMaster.load = data.master.load;
- newMaster.basis = data.master.basis;
for(int i=0;i<data.master.array.Length;i++)
newMaster.array[i] = data.master.array[i];
- data.master = newMaster;
+ this.data = new Data(newMaster, data.rev, data.baseline, data.history);
}
override internal PersistentArray create(Master master,int rev,int baseline, BitArray history){
diff --git a/src/cli/runtime/PersistentArray.cs b/src/cli/runtime/PersistentArray.cs
index ced36518..40e1fbc0 100644
--- a/src/cli/runtime/PersistentArray.cs
+++ b/src/cli/runtime/PersistentArray.cs
@@ -11,7 +11,6 @@
/* rich Jun 2, 2006 */
using System;
-using System.Threading;
using System.Collections;
namespace clojure.lang
@@ -41,7 +40,6 @@ namespace clojure.lang
*
* See Cohen for basic idea
* I added hybrid most-recent-sequential-range + shared-bitset idea, multi-thread-safety
- * Java implementation is lock-free
*/
public class PersistentArray : APersistentArray, IEnumerable
@@ -77,15 +75,17 @@ internal class Master{
internal int load;
internal readonly int maxLoad;
internal readonly float loadFactor;
- internal int[] basis;
- internal volatile Master next;
-
- internal Master(int size,Object defaultVal, float loadFactor){
+ internal readonly int[] basis;
+ internal Master next;
+
+ internal Master(int size, Object defaultVal, float loadFactor, int[] basis)
+ {
this.array = new Entry[size];
this.defaultVal = defaultVal;
this.rev = 0;
this.load = 0;
this.maxLoad = (int)(size * loadFactor);
+ this.basis = basis;
this.loadFactor = loadFactor;
}
internal Master(Master parent)
@@ -233,10 +233,11 @@ public void Reset()
}
internal class Data{
- internal Master master;
+ internal readonly Master master;
internal readonly int rev;
internal readonly int baseline;
internal readonly BitArray history;
+
public Data(Master master, int rev, int baseline, BitArray history)
{
this.master = master;
@@ -259,7 +260,7 @@ public PersistentArray(int size, Object defaultVal)
}
public PersistentArray(int size, Object defaultVal, float loadFactor){
- this.data = new Data(new Master(size, defaultVal, loadFactor), 0, 0, null);
+ this.data = new Data(new Master(size, defaultVal, loadFactor,null), 0, 0, null);
}
internal PersistentArray(Master master, int rev, int baseline, BitArray history)
@@ -359,7 +360,7 @@ public void isolate()
}
Entry getEntry(int i){
-for (Entry e = (Entry)data.master.array[i]; e != null; e = e.rest())
+for (Entry e = data.master.array[i]; e != null; e = e.rest())
{
if (e.rev <= data.rev)
{