summaryrefslogtreecommitdiff
path: root/rts
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2008-11-19 14:30:43 +0000
committerSimon Marlow <marlowsd@gmail.com>2008-11-19 14:30:43 +0000
commit65914a2cb71caf01655b16a75b283871e2482041 (patch)
tree518446977c6d32315006c21a4fa6950930f59b86 /rts
parent58852522d1ba4fb647bf2e0a67745a808a7da0c6 (diff)
downloadhaskell-65914a2cb71caf01655b16a75b283871e2482041.tar.gz
Remove incorrect assertions in steal()
Diffstat (limited to 'rts')
-rw-r--r--rts/Sparks.c8
-rw-r--r--rts/Sparks.h7
2 files changed, 12 insertions, 3 deletions
diff --git a/rts/Sparks.c b/rts/Sparks.c
index cb3d8d98eb..571529afbb 100644
--- a/rts/Sparks.c
+++ b/rts/Sparks.c
@@ -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;
}
diff --git a/rts/Sparks.h b/rts/Sparks.h
index f24ccca4ff..fd62c1288d 100644
--- a/rts/Sparks.h
+++ b/rts/Sparks.h
@@ -52,7 +52,12 @@ typedef struct SparkPool_ {
/* INVARIANTS, in this order: reasonable size,
- topBound consistent, space pointer, space accessible to us */
+ topBound consistent, space pointer, space accessible to us.
+
+ NB. This is safe to use only (a) on a spark pool owned by the
+ current thread, or (b) when there's only one thread running, or no
+ stealing going on (e.g. during GC).
+*/
#define ASSERT_SPARK_POOL_INVARIANTS(p) \
ASSERT((p)->size > 0); \
ASSERT((p)->topBound <= (p)->top); \