[libgee] Add missing fixes for ConcurrentSet from feature local branch



commit 4c596c6c679c90d020eef42b11ada98aa7a00bd5
Author: Maciej Piechotka <uzytkownik2 gmail com>
Date:   Mon Dec 3 20:07:53 2012 +0000

    Add missing fixes for ConcurrentSet from feature local branch

 gee/concurrentset.vala |   19 +++++++++----------
 1 files changed, 9 insertions(+), 10 deletions(-)
---
diff --git a/gee/concurrentset.vala b/gee/concurrentset.vala
index f5d49e2..62d937d 100644
--- a/gee/concurrentset.vala
+++ b/gee/concurrentset.vala
@@ -28,7 +28,7 @@
  * of structure during iteration is allowed. However the change may not be immidiatly
  * visible to other threads.
  */
-public class Gee.ConcurrentSet<G> : AbstractCollection<G> {
+public class Gee.ConcurrentSet<G> : AbstractSet<G> {
 	public ConcurrentSet (owned CompareDataFunc<G>? compare_func = null) {
 		if (compare_func == null) {
 			compare_func = Functions.get_compare_func_for (typeof (G));
@@ -57,7 +57,6 @@ public class Gee.ConcurrentSet<G> : AbstractCollection<G> {
 
 	public override bool add (G key) {
 		HazardPointer.Context ctx = new HazardPointer.Context ();
-		//FIXME: Synchronization
 		Rand *rnd = rand.get ();
 		if (rnd == null) {
 			rand.set (rnd = new Rand ());
@@ -137,7 +136,7 @@ public class Gee.ConcurrentSet<G> : AbstractCollection<G> {
 		public new bool foreach (ForallFunc<G> f) {
 			assert (_curr != null);
 			HazardPointer.Context ctx = new HazardPointer.Context ();
-			if (_prev != null && !_removed) {
+			if (_prev[0] != null && !_removed) {
 				if (!f (_curr._data)) {
 					assert (_curr != null);
 					return false;
@@ -147,20 +146,20 @@ public class Gee.ConcurrentSet<G> : AbstractCollection<G> {
 			Tower<G>? new_curr = _curr;
 			while (Tower.proceed<G> (_set._cmp, ref new_prev, ref new_curr, 0)) {
 				assert (_curr != null);
-				if (!f (_curr._data)) {
-					assert (_curr != null);
-					return false;
-				}
 				if (!_removed) {
 					//FIXME: Help mark/delete on the way
-					_prev[0] = (owned)new_prev;
+					_prev[0] = new_prev;
 					int prev_height = GLib.AtomicInt.get(ref _prev[0]._height);
 					for (int i = 1; i < prev_height; i++) {
 						_prev[i] = _prev[0];
 					}
 				}
-				_curr = (owned)new_curr;
+				_curr = new_curr;
 				_removed = false;
+				if (!f (_curr._data)) {
+					assert (_curr != null);
+					return false;
+				}
 			}
 			assert (_curr != null);
 			return true;
@@ -208,7 +207,7 @@ public class Gee.ConcurrentSet<G> : AbstractCollection<G> {
 			_removed = true;
 		}
 
-		public bool valid { get { return _prev != null && !_removed; } }
+		public bool valid { get { return _prev[0] != null && !_removed; } }
 
 		public bool read_only { get { return true; } }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]