[project @ 1999-12-20 10:34:27 by simonpj]
[ghc-hetmet.git] / ghc / rts / RtsStartup.c
index fd9d671..0996ba0 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: RtsStartup.c,v 1.13 1999/05/21 14:28:32 sof Exp $
+ * $Id: RtsStartup.c,v 1.25 1999/12/20 10:34:37 simonpj Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
 #include "StablePriv.h" /* initStablePtrTable */
 #include "Schedule.h"   /* initScheduler */
 #include "Stats.h"      /* initStats */
+#include "Signals.h"
+#include "Itimer.h"
 #include "Weak.h"
 #include "Ticky.h"
 
 #if defined(PROFILING)
 # include "ProfRts.h"
-#elif defined(DEBUG)
-# include "DebugProf.h"
+# include "ProfHeap.h"
 #endif
 
 #ifdef PAR
@@ -40,7 +41,9 @@ static int rts_has_started_up = 0;
 void
 startupHaskell(int argc, char *argv[])
 {
+#ifdef ENABLE_WIN32_DLL_SUPPORT
     int i;
+#endif
 
     /* To avoid repeated initialisations of the RTS */
    if (rts_has_started_up)
@@ -98,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();
 
@@ -108,14 +116,25 @@ startupHaskell(int argc, char *argv[])
     initProfiling();
 #endif
 
-    /* Initialise the scheduler */
-    initScheduler();
+    /* start the ticker */
+    install_vtalrm_handler();
+#if 0 /* tmp--SDM */
+    initialize_virtual_timer(TICK_MILLISECS);
+#endif
+
+    /* start our haskell execution tasks */
+#ifdef SMP
+    startTasks();
+#endif
 
     /* Initialise the stats department */
     initStats();
 
-#if 0
+#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,
@@ -137,12 +156,29 @@ startupHaskell(int argc, char *argv[])
     end_init();
 }
 
+/*
+ * Shutting down the RTS - two ways of doing this, one which
+ * calls exit(), one that doesn't.
+ *
+ * (shutdownHaskellAndExit() is called by System.exitWith).
+ */
+void
+shutdownHaskellAndExit(int n)
+{
+  OnExitHook();
+  shutdownHaskell();
+  stg_exit(n);
+}
+
 void
 shutdownHaskell(void)
 {
   if (!rts_has_started_up)
      return;
 
+  /* start timing the shutdown */
+  stat_startExit();
+
   /* Finalize any remaining weak pointers */
   finalizeWeakPointersNow();
 
@@ -152,7 +188,23 @@ shutdownHaskell(void)
     end_gr_simulation();
 #endif
 
-  /* clean up things from the storage manager's point of view */
+  /* 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)
@@ -167,27 +219,12 @@ shutdownHaskell(void)
   if (RtsFlags.TickyFlags.showTickyStats) PrintTickyInfo();
 #endif
 
-  /*
-    This fflush is important, because: if "main" just returns,
-    then we will end up in pre-supplied exit code that will close
-    streams and flush buffers.  In particular we have seen: it
-    will close fd 0 (stdin), then flush fd 1 (stdout), then <who
-    cares>...
-    
-    But if you're playing with sockets, that "close fd 0" might
-    suggest to the daemon that all is over, only to be presented
-    with more stuff on "fd 1" at the flush.
-    
-    The fflush avoids this sad possibility.
-   */
-  fflush(stdout);
-
   rts_has_started_up=0;
 }
 
 
 /* 
- * called from STG-land to exit the program cleanly 
+ * called from STG-land to exit the program
  */
 
 void  
@@ -196,7 +233,7 @@ stg_exit(I_ n)
 #ifdef PAR
   par_exit(n);
 #else
-  OnExitHook();
   exit(n);
 #endif
 }
+