/* -----------------------------------------------------------------------------
- * $Id: RtsStartup.c,v 1.36 2000/03/30 12:03:30 simonmar Exp $
+ * $Id: RtsStartup.c,v 1.41 2000/04/11 16:51:44 sewardj Exp $
*
* (c) The GHC Team, 1998-2000
*
#include "Prelude.h" /* fixupRTStoPreludeRefs */
#if defined(PROFILING) || defined(DEBUG)
-# include "ProfRts.h"
+# include "Profiling.h"
# include "ProfHeap.h"
#endif
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 */
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 */);
+ Capability cap;
+
+ 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 */
resetNonBlockingFd(1);
resetNonBlockingFd(2);
+#if defined(PAR)
+ shutdownParallelSystem(0);
+#endif
+
/* stop timing the shutdown, we're about to print stats */
stat_endExit();
rts_has_started_up=0;
-#if defined(PAR)
- shutdownParallelSystem(0);
-#endif
-
}
/*