X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FRtsStartup.c;h=c21aac767cd97a1b536f403028591554dfae31b6;hb=1c83695b5b9ae3175c18908c1d58aeadb1f225ae;hp=fd84000bba48b3d3b402ce713286164296a1edbd;hpb=4e1f1196f1349286c1480c19bd3a000346a120f4;p=ghc-hetmet.git diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c index fd84000..c21aac7 100644 --- a/rts/RtsStartup.c +++ b/rts/RtsStartup.c @@ -30,10 +30,12 @@ #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" +#include "Hash.h" #if defined(RTS_GTK_FRONTPANEL) #include "FrontPanel.h" @@ -46,19 +48,6 @@ # include "RetainerProfile.h" #endif -#if defined(GRAN) -# include "GranSimRts.h" -#endif - -#if defined(GRAN) || defined(PAR) -# include "ParallelRts.h" -#endif - -#if defined(PAR) -# include "Parallel.h" -# include "LLC.h" -#endif - #if defined(mingw32_HOST_OS) && !defined(THREADED_RTS) #include "win32/AsyncIO.h" #endif @@ -74,6 +63,9 @@ #ifdef HAVE_UNISTD_H #include #endif +#ifdef HAVE_LOCALE_H +#include +#endif #if USE_PAPI #include "Papi.h" @@ -143,6 +135,8 @@ hs_init(int *argc, char **argv[]) return; } + setlocale(LC_CTYPE,""); + /* Initialise the stats department, phase 0 */ initStats0(); @@ -157,22 +151,6 @@ hs_init(int *argc, char **argv[]) initAllocator(); #endif -#ifdef PAR - /* - * The parallel system needs to be initialised and synchronised before - * the program is run. - */ - startupParallelSystem(argv); - - if (*argv[0] == '-') { /* Strip off mainPE flag argument */ - argv++; - argc--; - } - - argv[1] = argv[0]; /* ignore the nPEs argument */ - argv++; argc--; -#endif - /* Set the RTS flags to default values. */ initRtsFlagsDefaults(); @@ -195,44 +173,37 @@ hs_init(int *argc, char **argv[]) #endif /* initTracing must be after setupRtsFlags() */ +#ifdef DEBUG initTracing(); - -#if defined(PAR) - /* NB: this really must be done after processing the RTS flags */ - IF_PAR_DEBUG(verbose, - debugBelch("==== Synchronising system (%d PEs)\n", nPEs)); - synchroniseSystem(); // calls initParallelSystem etc -#endif /* PAR */ +#endif /* initialise scheduler data structures (needs to be done before * initStorage()). */ initScheduler(); -#if defined(GRAN) - /* And start GranSim profiling if required: */ - if (RtsFlags.GranFlags.GranSimStats.Full) - init_gr_simulation(rts_argc, rts_argv, prog_argc, prog_argv); -#elif defined(PAR) - /* And start GUM profiling if required: */ - if (RtsFlags.ParFlags.ParStats.Full) - init_gr_simulation(rts_argc, rts_argv, prog_argc, prog_argv); -#endif /* PAR || GRAN */ - /* initialize the storage manager */ initStorage(); /* initialise the stable pointer table */ initStablePtrTable(); - /* Add some GC roots (using stable pointers): these are needed by - * all foreign export stubs, so they have to be treated as + /* 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) @@ -246,6 +217,12 @@ hs_init(int *argc, char **argv[]) initProfiling1(); +#ifdef EVENTLOG + if (RtsFlags.EventLogFlags.doEventLogging) { + initEventLogging(); + } +#endif + /* start the virtual timer 'subsystem'. */ initTimer(); startTimer(); @@ -394,25 +371,22 @@ hs_exit_(rtsBool wait_foreign) OnExitHook(); -#if defined(RTS_USER_SIGNALS) - if (RtsFlags.MiscFlags.install_signal_handlers) { - freeSignalHandlers(); - } -#endif - #if defined(THREADED_RTS) ioManagerDie(); #endif /* stop all running tasks */ exitScheduler(wait_foreign); + + /* run C finalizers for all active weak pointers */ + runAllCFinalizers(weak_ptr_list); -#if defined(GRAN) - /* end_gr_simulation prints global stats if requested -- HWL */ - if (!RtsFlags.GranFlags.GranSimStats.Suppressed) - end_gr_simulation(); +#if defined(RTS_USER_SIGNALS) + if (RtsFlags.MiscFlags.install_signal_handlers) { + freeSignalHandlers(); + } #endif - + /* stop the ticker */ stopTimer(); exitTimer(); @@ -443,14 +417,6 @@ hs_exit_(rtsBool wait_foreign) } #endif -#if defined(PAR) - /* controlled exit; good thread! */ - shutdownParallelSystem(0); - - /* global statistics in parallel system */ - PAR_TICKY_PAR_END(); -#endif - // uninstall signal handlers resetDefaultHandlers(); @@ -468,7 +434,7 @@ hs_exit_(rtsBool wait_foreign) freeScheduler(); /* free shared Typeable store */ - exitTypeableStore(); + exitGlobalStore(); /* free file locking tables, if necessary */ #if !defined(mingw32_HOST_OS) @@ -503,6 +469,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 @@ -546,12 +519,7 @@ shutdownHaskellAndExit(int n) hs_exit_(rtsFalse); if (hs_init_count == 0) { -#if defined(PAR) - /* really exit (stg_exit() would call shutdownParallelSystem() again) */ - exit(n); -#else stg_exit(n); -#endif } } @@ -568,24 +536,11 @@ shutdownHaskellAndSignal(int sig) * called from STG-land to exit the program */ -#ifdef PAR -static int exit_started=rtsFalse; -#endif - void (*exitFn)(int) = 0; void stg_exit(int n) { -#ifdef PAR - /* HACK: avoid a loop when exiting due to a stupid error */ - if (exit_started) - return; - exit_started=rtsTrue; - - IF_PAR_DEBUG(verbose, debugBelch("==-- stg_exit %d on [%x]...", n, mytid)); - shutdownParallelSystem(n); -#endif if (exitFn) (*exitFn)(n); exit(n);