Remove incorrect assertions in steal()
[ghc-hetmet.git] / rts / Sparks.c
index e7273f3..571529a 100644 (file)
@@ -202,10 +202,12 @@ steal(SparkPool *deque)
   StgClosurePtr stolen;
   StgWord b,t; 
 
-  ASSERT_SPARK_POOL_INVARIANTS(deque); 
+// Can't do this on someone else's spark pool:
+// ASSERT_SPARK_POOL_INVARIANTS(deque); 
 
   b = deque->bottom;
   t = deque->top;
+
   if (b - t <= 0 ) { 
     return NULL; /* already looks empty, abort */
   }
@@ -222,7 +224,9 @@ steal(SparkPool *deque)
       return NULL;
   }  /* else: OK, top has been incremented by the cas call */
 
-  ASSERT_SPARK_POOL_INVARIANTS(deque); 
+// Can't do this on someone else's spark pool:
+// ASSERT_SPARK_POOL_INVARIANTS(deque); 
+
   /* return stolen element */
   return stolen;
 }
@@ -389,6 +393,12 @@ pruneSparkQueue (evac_fn evac, void *user, Capability *cap)
     
     pool = cap->sparks;
     
+    // it is possible that top > bottom, indicating an empty pool.  We
+    // fix that here; this is only necessary because the loop below
+    // assumes it.
+    if (pool->top > pool->bottom)
+        pool->top = pool->bottom;
+
     // Take this opportunity to reset top/bottom modulo the size of
     // the array, to avoid overflow.  This is only possible because no
     // stealing is happening during GC.