X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FRtsStartup.c;h=c9edeace8e3c94fb2257b720c30885a8831176bd;hb=de75026f5a48d3d052135a973ab4dff76c5b20f5;hp=070275b534f7825efae60ae1cabd882e59954e30;hpb=8db56c8606e6c0e89a87d34c3f67124f1e8b988e;p=ghc-hetmet.git diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c index 070275b..c9edeac 100644 --- a/rts/RtsStartup.c +++ b/rts/RtsStartup.c @@ -30,10 +30,11 @@ #include "ThreadLabels.h" #include "BlockAlloc.h" #include "Trace.h" -#include "RtsTypeable.h" +#include "RtsGlobals.h" #include "Stable.h" #include "Hpc.h" #include "FileLock.h" +#include "EventLog.h" #if defined(RTS_GTK_FRONTPANEL) #include "FrontPanel.h" @@ -71,6 +72,9 @@ #ifdef HAVE_SIGNAL_H #include #endif +#ifdef HAVE_UNISTD_H +#include +#endif #if USE_PAPI #include "Papi.h" @@ -140,17 +144,20 @@ hs_init(int *argc, char **argv[]) return; } -#if defined(DEBUG) - /* Start off by initialising the allocator debugging so we can - * use it anywhere */ - initAllocator(); -#endif + /* Initialise the stats department, phase 0 */ + initStats0(); /* Next we do is grab the start time...just in case we're * collecting timing statistics. */ stat_startInit(); +#if defined(DEBUG) + /* Start off by initialising the allocator debugging so we can + * use it anywhere */ + initAllocator(); +#endif + #ifdef PAR /* * The parallel system needs to be initialised and synchronised before @@ -181,12 +188,17 @@ hs_init(int *argc, char **argv[]) setProgArgv(*argc,*argv); } + /* Initialise the stats department, phase 1 */ + initStats1(); + #ifdef USE_PAPI papi_init(); #endif /* initTracing must be after setupRtsFlags() */ +#ifdef DEBUG initTracing(); +#endif #if defined(PAR) /* NB: this really must be done after processing the RTS flags */ @@ -216,8 +228,22 @@ hs_init(int *argc, char **argv[]) /* initialise the stable pointer table */ initStablePtrTable(); + /* Add some GC roots for things in the base package that the RTS + * knows about. We don't know whether these turn out to be CAFs + * or refer to CAFs, but we have to assume that they might. + */ + getStablePtr((StgPtr)base_GHCziTopHandler_runIO_closure); + getStablePtr((StgPtr)base_GHCziTopHandler_runNonIO_closure); + getStablePtr((StgPtr)stackOverflow_closure); + getStablePtr((StgPtr)heapOverflow_closure); + getStablePtr((StgPtr)runFinalizerBatch_closure); + getStablePtr((StgPtr)unpackCString_closure); + getStablePtr((StgPtr)blockedOnDeadMVar_closure); + getStablePtr((StgPtr)nonTermination_closure); + getStablePtr((StgPtr)blockedIndefinitely_closure); + /* initialise the shared Typeable store */ - initTypeableStore(); + initGlobalStore(); /* initialise file locking, if necessary */ #if !defined(mingw32_HOST_OS) @@ -231,13 +257,16 @@ hs_init(int *argc, char **argv[]) initProfiling1(); +#ifdef EVENTLOG + if (RtsFlags.EventLogFlags.doEventLogging) { + initEventLogging(); + } +#endif + /* start the virtual timer 'subsystem'. */ initTimer(); startTimer(); - /* Initialise the stats department */ - initStats(); - #if defined(RTS_USER_SIGNALS) if (RtsFlags.MiscFlags.install_signal_handlers) { /* Initialise the user signal handler set */ @@ -380,11 +409,7 @@ hs_exit_(rtsBool wait_foreign) /* start timing the shutdown */ stat_startExit(); -#if defined(RTS_USER_SIGNALS) - if (RtsFlags.MiscFlags.install_signal_handlers) { - freeSignalHandlers(); - } -#endif + OnExitHook(); #if defined(THREADED_RTS) ioManagerDie(); @@ -392,7 +417,16 @@ hs_exit_(rtsBool wait_foreign) /* stop all running tasks */ exitScheduler(wait_foreign); + + /* run C finalizers for all active weak pointers */ + runAllCFinalizers(weak_ptr_list); +#if defined(RTS_USER_SIGNALS) + if (RtsFlags.MiscFlags.install_signal_handlers) { + freeSignalHandlers(); + } +#endif + #if defined(GRAN) /* end_gr_simulation prints global stats if requested -- HWL */ if (!RtsFlags.GranFlags.GranSimStats.Suppressed) @@ -437,6 +471,9 @@ hs_exit_(rtsBool wait_foreign) PAR_TICKY_PAR_END(); #endif + // uninstall signal handlers + resetDefaultHandlers(); + /* stop timing the shutdown, we're about to print stats */ stat_endExit(); @@ -451,7 +488,7 @@ hs_exit_(rtsBool wait_foreign) freeScheduler(); /* free shared Typeable store */ - exitTypeableStore(); + exitGlobalStore(); /* free file locking tables, if necessary */ #if !defined(mingw32_HOST_OS) @@ -486,6 +523,13 @@ hs_exit_(rtsBool wait_foreign) if (prof_file != NULL) fclose(prof_file); #endif +#ifdef EVENTLOG + if (RtsFlags.EventLogFlags.doEventLogging) { + endEventLogging(); + freeEventLogging(); + } +#endif + #if defined(TICKY_TICKY) if (RtsFlags.TickyFlags.showTickyStats) PrintTickyInfo(); #endif @@ -525,10 +569,10 @@ shutdownHaskell(void) void shutdownHaskellAndExit(int n) { - if (hs_init_count == 1) { - OnExitHook(); - hs_exit_(rtsFalse); - // we're about to exit(), no need to wait for foreign calls to return. + // we're about to exit(), no need to wait for foreign calls to return. + hs_exit_(rtsFalse); + + if (hs_init_count == 0) { #if defined(PAR) /* really exit (stg_exit() would call shutdownParallelSystem() again) */ exit(n); @@ -538,6 +582,15 @@ shutdownHaskellAndExit(int n) } } +#ifndef mingw32_HOST_OS +void +shutdownHaskellAndSignal(int sig) +{ + hs_exit_(rtsFalse); + kill(getpid(),sig); +} +#endif + /* * called from STG-land to exit the program */