traverse the spark pools only once during GC rather than twice
[ghc-hetmet.git] / rts / sm / GC.c
index c254fcb..5cd1298 100644 (file)
@@ -268,8 +268,9 @@ GarbageCollect ( rtsBool force_major_gc )
   memInventory(traceClass(DEBUG_gc));
 #endif
 
-  // check stack sanity *before* GC (ToDo: check all threads) 
+  // check stack sanity *before* GC
   IF_DEBUG(sanity, checkFreeListSanity());
+  IF_DEBUG(sanity, checkMutableLists());
 
   // Initialise all our gc_thread structures
   for (t = 0; t < n_gc_threads; t++) {
@@ -334,7 +335,8 @@ GarbageCollect ( rtsBool force_major_gc )
 
   // follow all the roots that the application knows about.
   gct->evac_step = 0;
-  markSomeCapabilities(mark_root, gct, gct->thread_index, n_gc_threads);
+  markSomeCapabilities(mark_root, gct, gct->thread_index, n_gc_threads,
+                       rtsTrue/*prune sparks*/);
 
 #if defined(RTS_USER_SIGNALS)
   // mark the signal handlers (signals should be already blocked)
@@ -494,8 +496,6 @@ GarbageCollect ( rtsBool force_major_gc )
           sweep(&oldest_gen->steps[0]);
   }
 
-  IF_DEBUG(sanity, checkGlobalTSOList(rtsFalse));
-
   /* run through all the generations/steps and tidy up 
    */
   copied = 0;
@@ -1005,7 +1005,8 @@ gc_thread_work (void)
 
     // Every thread evacuates some roots.
     gct->evac_step = 0;
-    markSomeCapabilities(mark_root, gct, gct->thread_index, n_gc_threads);
+    markSomeCapabilities(mark_root, gct, gct->thread_index, n_gc_threads,
+                         rtsTrue/*prune sparks*/);
 
     scavenge_until_all_done();
 }