Add an --install-signal-handlers=<yes|no> RTS flag; fixes trac #804
[ghc-hetmet.git] / rts / sm / GC.c
index 0b08bc8..1fee394 100644 (file)
@@ -1,9 +1,14 @@
 /* -----------------------------------------------------------------------------
  *
- * (c) The GHC Team 1998-2003
+ * (c) The GHC Team 1998-2006
  *
  * Generational garbage collector
  *
+ * Documentation on the architecture of the Garbage Collector can be
+ * found in the online commentary:
+ * 
+ *   http://hackage.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage/GC
+ *
  * ---------------------------------------------------------------------------*/
 
 #include "PosixSource.h"
@@ -12,8 +17,6 @@
 #include "RtsUtils.h"
 #include "Apply.h"
 #include "OSThreads.h"
-#include "Storage.h"
-#include "Stable.h"
 #include "LdvProfile.h"
 #include "Updates.h"
 #include "Stats.h"
@@ -205,8 +208,10 @@ GarbageCollect ( rtsBool force_major_gc )
   debugTrace(DEBUG_gc, "starting GC");
 
 #if defined(RTS_USER_SIGNALS)
-  // block signals
-  blockUserSignals();
+  if (RtsFlags.MiscFlags.install_signal_handlers) {
+    // block signals
+    blockUserSignals();
+  }
 #endif
 
   // tell the STM to discard any cached closures its hoping to re-use
@@ -479,10 +484,6 @@ GarbageCollect ( rtsBool force_major_gc )
    */
   markStablePtrTable(mark_root);
 
-  /* Mark the root pointer table.
-   */
-  markRootPtrTable(mark_root);
-
   /* -------------------------------------------------------------------------
    * Repeatedly scavenge all the areas we know about until there's no
    * more scavenging to be done.
@@ -650,7 +651,7 @@ GarbageCollect ( rtsBool force_major_gc )
        if (g <= N) {
          copied -= stp->hp_bd->start + BLOCK_SIZE_W -
            stp->hp_bd->free;
-         scavd_copied -= (P_)(BLOCK_ROUND_UP(stp->scavd_hp)) - stp->scavd_hp;
+         scavd_copied -= stp->scavd_hpLim - stp->scavd_hp;
        }
       }
 
@@ -1015,8 +1016,10 @@ GarbageCollect ( rtsBool force_major_gc )
   stat_endGC(allocated, live, copied, scavd_copied, N);
 
 #if defined(RTS_USER_SIGNALS)
-  // unblock signals again
-  unblockUserSignals();
+  if (RtsFlags.MiscFlags.install_signal_handlers) {
+    // unblock signals again
+    unblockUserSignals();
+  }
 #endif
 
   RELEASE_SM_LOCK;