Fix a very rare crash in GHCi
authorSimon Marlow <marlowsd@gmail.com>
Tue, 5 Oct 2010 14:47:35 +0000 (14:47 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 5 Oct 2010 14:47:35 +0000 (14:47 +0000)
When a BCO with a zero-length bitmap was right at the edge of
allocated memory, we were reading a word of non-existent memory.

This showed up as a segfault in T789(ghci) for me, but the crash was
extremely sensitive and went away with most changes.

Also, optimised scavenge_large_bitmap a bit while I was in there.

rts/sm/Scav.c

index e59fc75..d01442b 100644 (file)
@@ -1534,23 +1534,21 @@ scavenge_static(void)
 static void
 scavenge_large_bitmap( StgPtr p, StgLargeBitmap *large_bitmap, nat size )
 {
 static void
 scavenge_large_bitmap( StgPtr p, StgLargeBitmap *large_bitmap, nat size )
 {
-    nat i, b;
+    nat i, j, b;
     StgWord bitmap;
     
     b = 0;
     StgWord bitmap;
     
     b = 0;
-    bitmap = large_bitmap->bitmap[b];
-    for (i = 0; i < size; ) {
-       if ((bitmap & 1) == 0) {
-           evacuate((StgClosure **)p);
-       }
-       i++;
-       p++;
-       if (i % BITS_IN(W_) == 0) {
-           b++;
-           bitmap = large_bitmap->bitmap[b];
-       } else {
+
+    for (i = 0; i < size; b++) {
+        bitmap = large_bitmap->bitmap[b];
+        j = stg_min(size-i, BITS_IN(W_));
+        i += j;
+        for (; j > 0; j--, p++) {
+            if ((bitmap & 1) == 0) {
+                evacuate((StgClosure **)p);
+            }
            bitmap = bitmap >> 1;
            bitmap = bitmap >> 1;
-       }
+        }            
     }
 }
 
     }
 }