[project @ 2002-11-20 12:34:42 by chak]
[ghc-hetmet.git] / ghc / rts / RtsStartup.c
index 5d6e446..2a288b7 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: RtsStartup.c,v 1.53 2001/09/04 18:29:21 ken Exp $
+ * $Id: RtsStartup.c,v 1.66 2002/08/16 13:29:06 simonmar Exp $
  *
  * (c) The GHC Team, 1998-2000
  *
@@ -25,6 +25,7 @@
 #include "Prelude.h"           /* fixupRTStoPreludeRefs */
 #include "HsFFI.h"
 #include "Linker.h"
+#include "ThreadLabels.h"
 
 #if defined(RTS_GTK_FRONTPANEL)
 #include "FrontPanel.h"
@@ -33,6 +34,7 @@
 #if defined(PROFILING) || defined(DEBUG)
 # include "Profiling.h"
 # include "ProfHeap.h"
+# include "RetainerProfile.h"
 #endif
 
 #if defined(GRAN)
@@ -48,6 +50,8 @@
 # include "LLC.h"
 #endif
 
+#include <stdlib.h>
+
 /*
  * Flag Structure
  */
@@ -84,11 +88,16 @@ getProgArgv(int *argc, char **argv[])
 void
 startupHaskell(int argc, char *argv[], void (*init_root)(void))
 {
-    /* To avoid repeated initialisations of the RTS */
-   if (rts_has_started_up)
-     return;
-   else
-     rts_has_started_up=1;
+   /* To avoid repeated initialisations of the RTS */
+  if (rts_has_started_up) {
+    /* RTS is up and running, so only run the per-module initialisation code */
+    if (init_root) {
+      initModules(init_root);
+    }
+    return;
+  } else {
+    rts_has_started_up=1;
+  }
 
     /* The very first thing we do is grab the start time...just in case we're
      * collecting timing statistics.
@@ -150,6 +159,9 @@ startupHaskell(int argc, char *argv[], void (*init_root)(void))
     /* initialise the stable pointer table */
     initStablePtrTable();
 
+    /* initialise thread label table (tso->char*) */
+    initThreadLabelTable();
+
 #if defined(PROFILING) || defined(DEBUG)
     initProfiling1();
 #endif
@@ -161,14 +173,8 @@ startupHaskell(int argc, char *argv[], void (*init_root)(void))
     initProfiling2();
 #endif
 
-    /* start the ticker */
-    install_vtalrm_handler();
-    initialize_virtual_timer(TICK_MILLISECS);
-
-    /* start our haskell execution tasks */
-#ifdef SMP
-    startTasks();
-#endif
+    /* start the virtual timer 'subsystem'. */
+    startVirtTimer(TICK_MILLISECS);
 
     /* Initialise the stats department */
     initStats();
@@ -177,7 +183,7 @@ startupHaskell(int argc, char *argv[], void (*init_root)(void))
     /* Initialise the user signal handler set */
     initUserSignals();
     /* Set up handler to run on SIGINT, etc. */
-    init_default_handlers();
+    initDefaultHandlers();
 #endif
  
 #ifdef RTS_GTK_FRONTPANEL
@@ -218,29 +224,33 @@ startupHaskell(int argc, char *argv[], void (*init_root)(void))
 
 /* The init functions use an explicit stack... 
  */
-#define INIT_STACK_SIZE  (BLOCK_SIZE * 4)
+#define INIT_STACK_BLOCKS  4
 F_ *init_stack = NULL;
-nat init_sp = 0;
 
 static void
 initModules ( void (*init_root)(void) )
 {
+    bdescr *bd;
 #ifdef SMP
     Capability cap;
 #else
-#define cap MainRegTable
+#define cap MainCapability
 #endif
+    nat init_sp;
 
     init_sp = 0;
-    init_stack = (F_ *)allocate(INIT_STACK_SIZE / sizeof(W_));
+    bd = allocGroup(INIT_STACK_BLOCKS);
+    init_stack = (F_ *)bd->start;
     init_stack[init_sp++] = (F_)stg_init_ret;
     init_stack[init_sp++] = (F_)__stginit_Prelude;
     if (init_root != NULL) {
        init_stack[init_sp++] = (F_)init_root;
     }
     
-    cap.rSp = (P_)(init_stack + init_sp);
-    StgRun((StgFunPtr)stg_init, &cap);
+    cap.r.rSp = (P_)(init_stack + init_sp);
+    StgRun((StgFunPtr)stg_init, &cap.r);
+
+    freeGroup(bd);
 }
 
 /* -----------------------------------------------------------------------------
@@ -268,10 +278,14 @@ shutdownHaskell(void)
 {
   if (!rts_has_started_up)
      return;
-
+  rts_has_started_up=0;
+  
   /* start timing the shutdown */
   stat_startExit();
 
+  /* stop all running tasks */
+  exitScheduler();
+
 #if !defined(GRAN)
   /* Finalize any remaining weak pointers */
   finalizeWeakPointersNow();
@@ -283,11 +297,8 @@ shutdownHaskell(void)
     end_gr_simulation();
 #endif
 
-  /* stop all running tasks */
-  exitScheduler();
-
   /* stop the ticker */
-  initialize_virtual_timer(0);
+  stopVirtTimer();
   
   /* reset the standard file descriptors to blocking mode */
   resetNonBlockingFd(0);
@@ -316,19 +327,24 @@ shutdownHaskell(void)
     }
 #endif
 
+#if defined(PROFILING) 
+  reportCCSProfiling();
+#endif
+
 #if defined(PROFILING) || defined(DEBUG)
   endProfiling();
 #endif
 
-#if defined(PROFILING) 
-  report_ccs_profiling();
+#ifdef PROFILING
+  // Originally, this was in report_ccs_profiling().  Now, retainer
+  // profiling might tack some extra stuff on to the end of this file
+  // during endProfiling().
+  fclose(prof_file);
 #endif
 
 #if defined(TICKY_TICKY)
   if (RtsFlags.TickyFlags.showTickyStats) PrintTickyInfo();
 #endif
-
-  rts_has_started_up=0;
 }
 
 /*