X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FRtsStartup.c;h=4066f4894f447529a31c7290352b30e11bec7c09;hb=1553c7788e7f663bfc55813158325d695a21a229;hp=69de6722943823ddbeb3a571d1ab261e9b0af5b6;hpb=db61851c5472bf565cd1da900b33d6e033fd743d;p=ghc-hetmet.git diff --git a/ghc/rts/RtsStartup.c b/ghc/rts/RtsStartup.c index 69de672..4066f48 100644 --- a/ghc/rts/RtsStartup.c +++ b/ghc/rts/RtsStartup.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: RtsStartup.c,v 1.56 2001/11/22 14:25:12 simonmar Exp $ + * $Id: RtsStartup.c,v 1.61 2002/02/04 20:25:39 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,14 +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 our haskell execution tasks */ -#ifdef SMP - startTasks(); -#endif + /* start the virtual timer 'subsystem'. */ + startVirtTimer(TICK_MILLISECS); /* Initialise the stats department */ initStats(); @@ -234,7 +233,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 +276,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 +291,7 @@ shutdownHaskell(void) exitScheduler(); /* stop the ticker */ - initialize_virtual_timer(0); + stopVirtTimer(); /* reset the standard file descriptors to blocking mode */ resetNonBlockingFd(0); @@ -342,7 +321,7 @@ shutdownHaskell(void) #endif #if defined(PROFILING) - report_ccs_profiling(); + reportCCSProfiling(); #endif #if defined(PROFILING) || defined(DEBUG)