X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FRtsStartup.c;h=1d0fec5dd78c1bf89212cd1a3878d82935b1b556;hb=61caf48a5f848cdd24e36a35645bc13c161df7a3;hp=f2a0dd71c36243d41583b44f7c11a014fc910b74;hpb=fe07f054d7ae5e10b14d5fed730fe4424dabd587;p=ghc-hetmet.git diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c index f2a0dd7..1d0fec5 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(); @@ -160,9 +168,18 @@ hs_init(int *argc, char **argv[]) /* Initialise the performance tracking library */ #ifdef USE_PAPI - /* Must fix to abort gracefully */ - if(PAPI_library_init(PAPI_VER_CURRENT) != PAPI_VER_CURRENT) - exit(1); + { + int ver; + if ((ver = PAPI_library_init(PAPI_VER_CURRENT)) != PAPI_VER_CURRENT) { + if (ver > 0) { + errorBelch("PAPI_library_init: wrong version: %x", ver); + stg_exit(EXIT_FAILURE); + } else { + sysErrorBelch("PAPI_library_init"); + stg_exit(EXIT_FAILURE); + } + } + } #ifdef THREADED_RTS { int err; @@ -228,9 +245,7 @@ hs_init(int *argc, char **argv[]) initThreadLabelTable(); #endif -#if defined(PROFILING) || defined(DEBUG) initProfiling1(); -#endif /* start the virtual timer 'subsystem'. */ startTimer(); @@ -239,13 +254,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 @@ -259,7 +276,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 @@ -335,11 +352,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 } /* ----------------------------------------------------------------------------- @@ -362,7 +377,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 @@ -377,7 +398,7 @@ hs_exit(void) /* stop the ticker */ stopTimer(); - + /* reset the standard file descriptors to blocking mode */ resetNonBlockingFd(0); resetNonBlockingFd(1); @@ -422,12 +443,22 @@ 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(); + freeProfiling1(); + +#if defined(DEBUG) + /* free the thread label table */ + freeThreadLabelTable(); +#endif + /* free hash table storage */ exitHashTable(); @@ -441,9 +472,7 @@ hs_exit(void) reportCCSProfiling(); #endif -#if defined(PROFILING) || defined(DEBUG) endProfiling(); -#endif #ifdef PROFILING // Originally, this was in report_ccs_profiling(). Now, retainer @@ -456,12 +485,18 @@ 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. + // Finally, free all our storage freeStorage(); + +#if defined(DEBUG) + /* and shut down the allocator debugging */ + shutdownAllocator(); +#endif + } // Compatibility interfaces