[project @ 1999-12-20 10:34:27 by simonpj]
[ghc-hetmet.git] / ghc / rts / RtsStartup.c
index 4c281a6..0996ba0 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: RtsStartup.c,v 1.20 1999/09/15 13:45:20 simonmar Exp $
+ * $Id: RtsStartup.c,v 1.25 1999/12/20 10:34:37 simonpj Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
@@ -101,6 +101,11 @@ startupHaskell(int argc, char *argv[])
     */
 #endif /* PAR */
 
+    /* initialise scheduler data structures (needs to be done before
+     * initStorage()).
+     */
+    initScheduler();
+
     /* initialize the storage manager */
     initStorage();
 
@@ -113,17 +118,23 @@ startupHaskell(int argc, char *argv[])
 
     /* start the ticker */
     install_vtalrm_handler();
+#if 0 /* tmp--SDM */
     initialize_virtual_timer(TICK_MILLISECS);
+#endif
 
-    /* Initialise the scheduler */
-    initScheduler();
+    /* start our haskell execution tasks */
+#ifdef SMP
+    startTasks();
+#endif
 
     /* Initialise the stats department */
     initStats();
 
-    /* Initialise the user signal handler set */
 #if !defined(mingw32_TARGET_OS) && !defined(PAR)
+    /* Initialise the user signal handler set */
     initUserSignals();
+    /* Set up handler to run on SIGINT */
+    init_shutdown_handler();
 #endif
  
     /* When the RTS and Prelude live in separate DLLs,
@@ -165,6 +176,9 @@ shutdownHaskell(void)
   if (!rts_has_started_up)
      return;
 
+  /* start timing the shutdown */
+  stat_startExit();
+
   /* Finalize any remaining weak pointers */
   finalizeWeakPointersNow();
 
@@ -174,11 +188,24 @@ shutdownHaskell(void)
     end_gr_simulation();
 #endif
 
-  /* clean up things from the storage manager's point of view */
-  exitStorage();
+  /* stop all running tasks */
+  exitScheduler();
 
   /* stop the ticker */
   initialize_virtual_timer(0);
+  
+  /* reset the standard file descriptors to blocking mode */
+  resetNonBlockingFd(0);
+  resetNonBlockingFd(1);
+  resetNonBlockingFd(2);
+
+  /* stop timing the shutdown, we're about to print stats */
+  stat_endExit();
+
+  /* clean up things from the storage manager's point of view.
+   * also outputs the stats (+RTS -s) info.
+   */
+  exitStorage();
 
 #if defined(PROFILING) || defined(DEBUG)
   endProfiling();