markSignalHandlers(): implementation was unnecessary, and had a bug
authorsimonmar@microsoft.com <unknown>
Tue, 6 Jun 2006 08:58:05 +0000 (08:58 +0000)
committersimonmar@microsoft.com <unknown>
Tue, 6 Jun 2006 08:58:05 +0000 (08:58 +0000)
There's no need to mark the signal handler here, because it is stored
in a StablePtr and hence is a root anyway.  Furthermore, the call to
evac() was passing the address of a local variable, which turned out
to be harmless for copying GC, but fatal for compacting GC: compacting
GC assumes that the addresses of the roots are the same each time.

Fixes: possibly #783, possibly #776, definitely #787

rts/win32/ConsoleHandler.c

index d7096db..cc0365b 100644 (file)
@@ -180,10 +180,8 @@ void startSignalHandlers(Capability *cap)
  */
 void markSignalHandlers (evac_fn evac)
 {
-    if (console_handler >= 0) {
-       StgPtr p = deRefStablePtr((StgStablePtr)console_handler);
-       evac((StgClosure**)(void *)&p);
-    }
+    // nothing to mark; the console handler is a StablePtr which is
+    // already treated as a root by the GC.
 }