X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FRtsStartup.c;h=48ae736a461f88587a8bd29ce90b4ff310e49025;hb=c38093b57a3effcc8156736787958cc6b65e963d;hp=62258f22dec9b53f7ca0762e593ed7427c30dbbd;hpb=c108d3f61b1a5fefa8e15aa6ada4ff547bcbb4e5;p=ghc-hetmet.git diff --git a/ghc/rts/RtsStartup.c b/ghc/rts/RtsStartup.c index 62258f2..48ae736 100644 --- a/ghc/rts/RtsStartup.c +++ b/ghc/rts/RtsStartup.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: RtsStartup.c,v 1.36 2000/03/30 12:03:30 simonmar Exp $ + * $Id: RtsStartup.c,v 1.42 2000/04/20 13:20:31 simonmar Exp $ * * (c) The GHC Team, 1998-2000 * @@ -24,7 +24,7 @@ #include "Prelude.h" /* fixupRTStoPreludeRefs */ #if defined(PROFILING) || defined(DEBUG) -# include "ProfRts.h" +# include "Profiling.h" # include "ProfHeap.h" #endif @@ -53,6 +53,26 @@ EXTFUN(__init_Prelude); static void initModules ( void * ); void +setProgArgv(int argc, char *argv[]) +{ + /* Usually this is done by startupHaskell, so we don't need to call this. + However, sometimes Hugs wants to change the arguments which Haskell + getArgs >>= ... will be fed. So you can do that by calling here + _after_ calling startupHaskell. + */ + prog_argc = argc; + prog_argv = argv; +} + +void +getProgArgv(int *argc, char **argv[]) +{ + *argc = prog_argc; + *argv = prog_argv; +} + + +void startupHaskell(int argc, char *argv[], void *init_root) { /* To avoid repeated initialisations of the RTS */ @@ -196,29 +216,33 @@ startupHaskell(int argc, char *argv[], void *init_root) StgRun to call this stuff. -------------------------------------------------------------------------- */ -#ifndef INTERPRETER - /* The init functions use an explicit stack... */ #define INIT_STACK_SIZE (BLOCK_SIZE * 4) F_ *init_stack = NULL; nat init_sp = 0; +#ifndef INTERPRETER static void initModules ( void *init_root ) { - init_sp = 0; - init_stack = (F_ *)allocate(INIT_STACK_SIZE / sizeof(W_)); - init_stack[init_sp++] = (F_)stg_init_ret; - init_stack[init_sp++] = (F_)__init_Prelude; - if (init_root != NULL) { - init_stack[init_sp++] = (F_)init_root; - } - - MainRegTable.rSp = (P_)(init_stack + init_sp); - StgRun((StgFunPtr)stg_init, NULL/* no reg table */); -} +#ifdef SMP + Capability cap; +#else +#define cap MainRegTable +#endif + init_sp = 0; + init_stack = (F_ *)allocate(INIT_STACK_SIZE / sizeof(W_)); + init_stack[init_sp++] = (F_)stg_init_ret; + init_stack[init_sp++] = (F_)__init_Prelude; + if (init_root != NULL) { + init_stack[init_sp++] = (F_)init_root; + } + + cap.rSp = (P_)(init_stack + init_sp); + StgRun((StgFunPtr)stg_init, &cap); +} #endif /* !INTERPRETER */ /* ----------------------------------------------------------------------------- @@ -267,6 +291,10 @@ shutdownHaskell(void) resetNonBlockingFd(1); resetNonBlockingFd(2); +#if defined(PAR) + shutdownParallelSystem(0); +#endif + /* stop timing the shutdown, we're about to print stats */ stat_endExit(); @@ -289,10 +317,6 @@ shutdownHaskell(void) rts_has_started_up=0; -#if defined(PAR) - shutdownParallelSystem(0); -#endif - } /*