[project @ 2001-12-10 17:59:54 by sof]
[ghc-hetmet.git] / ghc / rts / RtsStartup.c
index 69de672..ce133dc 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: RtsStartup.c,v 1.56 2001/11/22 14:25:12 simonmar Exp $
+ * $Id: RtsStartup.c,v 1.59 2001/12/06 07:07:12 sof Exp $
  *
  * (c) The GHC Team, 1998-2000
  *
@@ -86,10 +86,15 @@ 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;
+  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.
@@ -162,9 +167,8 @@ startupHaskell(int argc, char *argv[], void (*init_root)(void))
     initProfiling2();
 #endif
 
-    /* start the ticker */
-    install_vtalrm_handler();
-    initialize_virtual_timer(TICK_MILLISECS);
+    /* start the virtual timer 'subsystem'. */
+    startVirtTimer(TICK_MILLISECS);
 
     /* start our haskell execution tasks */
 #ifdef SMP
@@ -234,7 +238,7 @@ initModules ( void (*init_root)(void) )
 #endif
 
     init_sp = 0;
-    bd = allocGroup(4);
+    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;
@@ -277,26 +281,6 @@ shutdownHaskell(void)
   /* start timing the shutdown */
   stat_startExit();
 
-#ifdef PROFILING
-  // @LDV profiling
-  // 
-  // Note: 
-  //   We do not need to perform a major garbage collection because all the
-  //   closures created since the last census will not affect the profiling
-  //   statistics anyhow.
-  // 
-  // Note: 
-  //   We ignore any object created afterwards. 
-  //   finalizeWeakPointersNow() may corrupt the heap (because it executes 
-  //   rts_evalIO(), which adds an initial evaluation stack again).
-  //   Thus, we call LdvCensusKillAll() here, and prohibit LDV profiling
-  //   afterwards. 
-  //   Acutally, it is pointless to call LdvCensusKillAll() any later because
-  //   no object created later will be taken into account for profiling.
-  if (RtsFlags.ProfFlags.doHeapProfile == HEAP_BY_LDV) 
-    LdvCensusKillAll();
-#endif
-
 #if !defined(GRAN)
   /* Finalize any remaining weak pointers */
   finalizeWeakPointersNow();
@@ -312,7 +296,7 @@ shutdownHaskell(void)
   exitScheduler();
 
   /* stop the ticker */
-  initialize_virtual_timer(0);
+  stopVirtTimer();
   
   /* reset the standard file descriptors to blocking mode */
   resetNonBlockingFd(0);