1 /* -----------------------------------------------------------------------------
2 * $Id: RtsStartup.c,v 1.21 1999/09/22 11:53:33 sof Exp $
4 * (c) The GHC Team, 1998-1999
6 * Main function for a standalone Haskell program.
8 * ---------------------------------------------------------------------------*/
14 #include "Storage.h" /* initStorage, exitStorage */
15 #include "StablePriv.h" /* initStablePtrTable */
16 #include "Schedule.h" /* initScheduler */
17 #include "Stats.h" /* initStats */
23 #if defined(PROFILING)
25 # include "ProfHeap.h"
37 struct RTS_FLAGS RtsFlags;
39 static int rts_has_started_up = 0;
42 startupHaskell(int argc, char *argv[])
44 #ifdef ENABLE_WIN32_DLL_SUPPORT
48 /* To avoid repeated initialisations of the RTS */
49 if (rts_has_started_up)
55 int nPEs = 0; /* Number of PEs */
58 /* The very first thing we do is grab the start time...just in case we're
59 * collecting timing statistics.
65 *The parallel system needs to be initialised and synchronised before
68 if (*argv[0] == '-') { /* Look to see whether we're the Main Thread */
69 IAmMainThread = rtsTrue;
70 argv++; argc--; /* Strip off flag argument */
71 /* fprintf(stderr, "I am Main Thread\n"); */
74 * Grab the number of PEs out of the argument vector, and
75 * eliminate it from further argument processing.
80 initEachPEHook(); /* HWL: hook to be execed on each PE */
84 /* Set the RTS flags to default values. */
85 initRtsFlagsDefaults();
87 /* Call the user hook to reset defaults, if present */
90 /* Parse the flags, separating the RTS flags from the programs args */
91 setupRtsFlags(&argc, argv, &rts_argc, rts_argv);
96 /* Initialise the parallel system -- before initHeap! */
98 /* And start GranSim profiling if required: omitted for now
99 *if (Rtsflags.ParFlags.granSimStats)
100 *init_gr_profiling(rts_argc, rts_argv, prog_argc, prog_argv);
104 /* initialize the storage manager */
107 /* initialise the stable pointer table */
108 initStablePtrTable();
110 #if defined(PROFILING) || defined(DEBUG)
114 /* start the ticker */
115 install_vtalrm_handler();
116 initialize_virtual_timer(TICK_MILLISECS);
118 /* Initialise the scheduler */
121 /* Initialise the stats department */
124 #if !defined(mingw32_TARGET_OS) && !defined(PAR)
125 /* Initialise the user signal handler set */
127 /* Set up handler to run on SIGINT */
128 init_shutdown_handler();
131 /* When the RTS and Prelude live in separate DLLs,
132 we need to patch up the char- and int-like tables
133 that the RTS keep after both DLLs have been loaded,
134 filling in the tables with references to where the
135 static info tables have been loaded inside the running
138 #ifdef ENABLE_WIN32_DLL_SUPPORT
140 (CHARLIKE_closure[i]).header.info = (const StgInfoTable*)&Czh_static_info;
143 (INTLIKE_closure[i]).header.info = (const StgInfoTable*)&Izh_static_info;
146 /* Record initialization times */
151 * Shutting down the RTS - two ways of doing this, one which
152 * calls exit(), one that doesn't.
154 * (shutdownHaskellAndExit() is called by System.exitWith).
157 shutdownHaskellAndExit(int n)
165 shutdownHaskell(void)
167 if (!rts_has_started_up)
170 /* Finalize any remaining weak pointers */
171 finalizeWeakPointersNow();
175 if (!RTSflags.GranFlags.granSimStats_suppressed)
179 /* clean up things from the storage manager's point of view */
182 /* stop the ticker */
183 initialize_virtual_timer(0);
185 #if defined(PROFILING) || defined(DEBUG)
189 #if defined(PROFILING)
190 report_ccs_profiling( );
193 #if defined(TICKY_TICKY)
194 if (RtsFlags.TickyFlags.showTickyStats) PrintTickyInfo();
197 rts_has_started_up=0;
202 * called from STG-land to exit the program