[project @ 2002-10-11 08:04:55 by simonpj]
[ghc-hetmet.git] / ghc / rts / Schedule.c
index c0a9c04..9759b55 100644 (file)
@@ -1,5 +1,5 @@
 /* ---------------------------------------------------------------------------
- * $Id: Schedule.c,v 1.154 2002/09/17 12:20:15 simonmar Exp $
+ * $Id: Schedule.c,v 1.156 2002/09/25 14:46:31 simonmar Exp $
  *
  * (c) The GHC Team, 1998-2000
  *
@@ -2473,8 +2473,29 @@ GetRoots(evac_fn evac)
   markSparkQueue(evac);
 #endif
 
+#ifndef mingw32_TARGET_OS
   // mark the signal handlers (signals should be already blocked)
   markSignalHandlers(evac);
+#endif
+
+  // main threads which have completed need to be retained until they
+  // are dealt with in the main scheduler loop.  They won't be
+  // retained any other way: the GC will drop them from the
+  // all_threads list, so we have to be careful to treat them as roots
+  // here.
+  { 
+      StgMainThread *m;
+      for (m = main_threads; m != NULL; m = m->link) {
+         switch (m->tso->what_next) {
+         case ThreadComplete:
+         case ThreadKilled:
+             evac((StgClosure **)&m->tso);
+             break;
+         default:
+             break;
+         }
+      }
+  }
 }
 
 /* -----------------------------------------------------------------------------