/* -----------------------------------------------------------------------------
- * $Id: RtsStartup.c,v 1.17 1999/07/06 15:33:23 simonmar Exp $
+ * $Id: RtsStartup.c,v 1.25 1999/12/20 10:34:37 simonpj Exp $
*
* (c) The GHC Team, 1998-1999
*
#include "StablePriv.h" /* initStablePtrTable */
#include "Schedule.h" /* initScheduler */
#include "Stats.h" /* initStats */
+#include "Signals.h"
+#include "Itimer.h"
#include "Weak.h"
#include "Ticky.h"
#if defined(PROFILING)
# include "ProfRts.h"
-#elif defined(DEBUG)
-# include "DebugProf.h"
+# include "ProfHeap.h"
#endif
#ifdef PAR
*/
#endif /* PAR */
+ /* initialise scheduler data structures (needs to be done before
+ * initStorage()).
+ */
+ initScheduler();
+
/* initialize the storage manager */
initStorage();
initProfiling();
#endif
- /* Initialise the scheduler */
- initScheduler();
+ /* start the ticker */
+ install_vtalrm_handler();
+#if 0 /* tmp--SDM */
+ initialize_virtual_timer(TICK_MILLISECS);
+#endif
+
+ /* start our haskell execution tasks */
+#ifdef SMP
+ startTasks();
+#endif
/* Initialise the stats department */
initStats();
-#if 0
+#if !defined(mingw32_TARGET_OS) && !defined(PAR)
+ /* Initialise the user signal handler set */
initUserSignals();
+ /* Set up handler to run on SIGINT */
+ init_shutdown_handler();
#endif
/* When the RTS and Prelude live in separate DLLs,
if (!rts_has_started_up)
return;
+ /* start timing the shutdown */
+ stat_startExit();
+
/* Finalize any remaining weak pointers */
finalizeWeakPointersNow();
end_gr_simulation();
#endif
- /* clean up things from the storage manager's point of view */
+ /* stop all running tasks */
+ exitScheduler();
+
+ /* stop the ticker */
+ initialize_virtual_timer(0);
+
+ /* reset the standard file descriptors to blocking mode */
+ resetNonBlockingFd(0);
+ resetNonBlockingFd(1);
+ resetNonBlockingFd(2);
+
+ /* stop timing the shutdown, we're about to print stats */
+ stat_endExit();
+
+ /* clean up things from the storage manager's point of view.
+ * also outputs the stats (+RTS -s) info.
+ */
exitStorage();
#if defined(PROFILING) || defined(DEBUG)