X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=rts%2FRtsStartup.c;h=a363c133f40908ddc735ff9de4640d1c2c638a34;hp=c2f765a9bef7f1e701d3a2fec68f918921ff28e0;hb=8bac478832e0cf9fa7ad1cfc81c08b0b9f13938e;hpb=3d3f4dea2ac829f450bc2bb2ceed777864ba6aec diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c index c2f765a..a363c13 100644 --- a/rts/RtsStartup.c +++ b/rts/RtsStartup.c @@ -19,6 +19,7 @@ #include "STM.h" /* initSTM */ #include "Signals.h" #include "RtsSignals.h" +#include "ThrIOManager.h" #include "Timer.h" /* startTimer, stopTimer */ #include "Weak.h" #include "Ticky.h" @@ -37,8 +38,9 @@ #include "FrontPanel.h" #endif -#if defined(PROFILING) || defined(DEBUG) # include "Profiling.h" + +#if defined(PROFILING) # include "ProfHeap.h" # include "RetainerProfile.h" #endif @@ -56,7 +58,7 @@ # include "LLC.h" #endif -#if defined(mingw32_HOST_OS) +#if defined(mingw32_HOST_OS) && !defined(THREADED_RTS) #include "win32/AsyncIO.h" #endif @@ -137,7 +139,13 @@ hs_init(int *argc, char **argv[]) return; } - /* The very first thing we do is grab the start time...just in case we're +#if defined(DEBUG) + /* Start off by initialising the allocator debugging so we can + * use it anywhere */ + initAllocator(); +#endif + + /* Next we do is grab the start time...just in case we're * collecting timing statistics. */ stat_startInit(); @@ -191,6 +199,7 @@ hs_init(int *argc, char **argv[]) /* Parse the flags, separating the RTS flags from the programs args */ if (argc != NULL && argv != NULL) { + setFullProgArgv(*argc,*argv); setupRtsFlags(argc, *argv, &rts_argc, rts_argv); setProgArgv(*argc,*argv); } @@ -205,9 +214,6 @@ hs_init(int *argc, char **argv[]) synchroniseSystem(); // calls initParallelSystem etc #endif /* PAR */ - /* Perform initialisation of adjustor thunk layer. */ - initAdjustor(); - /* initialise scheduler data structures (needs to be done before * initStorage()). */ @@ -237,9 +243,7 @@ hs_init(int *argc, char **argv[]) initThreadLabelTable(); #endif -#if defined(PROFILING) || defined(DEBUG) initProfiling1(); -#endif /* start the virtual timer 'subsystem'. */ startTimer(); @@ -248,13 +252,15 @@ hs_init(int *argc, char **argv[]) initStats(); #if defined(RTS_USER_SIGNALS) - /* Initialise the user signal handler set */ - initUserSignals(); - /* Set up handler to run on SIGINT, etc. */ - initDefaultHandlers(); + if (RtsFlags.MiscFlags.install_signal_handlers) { + /* Initialise the user signal handler set */ + initUserSignals(); + /* Set up handler to run on SIGINT, etc. */ + initDefaultHandlers(); + } #endif -#if defined(mingw32_HOST_OS) +#if defined(mingw32_HOST_OS) && !defined(THREADED_RTS) startupAsyncIO(); #endif @@ -268,7 +274,7 @@ hs_init(int *argc, char **argv[]) x86_init_fpu(); #endif -#if defined(THREADED_RTS) && !defined(mingw32_HOST_OS) +#if defined(THREADED_RTS) ioManagerStart(); #endif @@ -344,11 +350,9 @@ hs_add_root(void (*init_root)(void)) startupHpc(); -#if defined(PROFILING) || defined(DEBUG) // This must be done after module initialisation. // ToDo: make this work in the presence of multiple hs_add_root()s. initProfiling2(); -#endif } /* ----------------------------------------------------------------------------- @@ -371,7 +375,13 @@ hs_exit(void) /* start timing the shutdown */ stat_startExit(); -#if defined(THREADED_RTS) && !defined(mingw32_HOST_OS) +#if defined(RTS_USER_SIGNALS) + if (RtsFlags.MiscFlags.install_signal_handlers) { + freeSignalHandlers(); + } +#endif + +#if defined(THREADED_RTS) ioManagerDie(); #endif @@ -386,7 +396,7 @@ hs_exit(void) /* stop the ticker */ stopTimer(); - + /* reset the standard file descriptors to blocking mode */ resetNonBlockingFd(0); resetNonBlockingFd(1); @@ -431,14 +441,21 @@ hs_exit(void) // also outputs the stats (+RTS -s) info. exitStorage(); + /* free the tasks */ + freeScheduler(); + /* free shared Typeable store */ exitTypeableStore(); - /* initialise the stable pointer table */ + /* free the stable pointer table */ exitStablePtrTable(); - /* free hash table storage */ - exitHashTable(); + freeProfiling1(); + +#if defined(DEBUG) + /* free the thread label table */ + freeThreadLabelTable(); +#endif #ifdef RTS_GTK_FRONTPANEL if (RtsFlags.GcFlags.frontpanel) { @@ -450,9 +467,7 @@ hs_exit(void) reportCCSProfiling(); #endif -#if defined(PROFILING) || defined(DEBUG) endProfiling(); -#endif #ifdef PROFILING // Originally, this was in report_ccs_profiling(). Now, retainer @@ -465,12 +480,21 @@ hs_exit(void) if (RtsFlags.TickyFlags.showTickyStats) PrintTickyInfo(); #endif -#if defined(mingw32_HOST_OS) +#if defined(mingw32_HOST_OS) && !defined(THREADED_RTS) shutdownAsyncIO(); #endif - // Finally, free all our storage. + /* free hash table storage */ + exitHashTable(); + + // Finally, free all our storage freeStorage(); + +#if defined(DEBUG) + /* and shut down the allocator debugging */ + shutdownAllocator(); +#endif + } // Compatibility interfaces