#include "STM.h" /* initSTM */
#include "Signals.h"
#include "RtsSignals.h"
+#include "ThrIOManager.h"
#include "Timer.h" /* startTimer, stopTimer */
#include "Weak.h"
#include "Ticky.h"
#include "FrontPanel.h"
#endif
-#if defined(PROFILING) || defined(DEBUG)
# include "Profiling.h"
+
+#if defined(PROFILING)
# include "ProfHeap.h"
# include "RetainerProfile.h"
#endif
# include "LLC.h"
#endif
-#if defined(mingw32_HOST_OS)
+#if defined(mingw32_HOST_OS) && !defined(THREADED_RTS)
#include "win32/AsyncIO.h"
#endif
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();
synchroniseSystem(); // calls initParallelSystem etc
#endif /* PAR */
- /* Perform initialisation of adjustor thunk layer. */
- initAdjustor();
-
/* initialise scheduler data structures (needs to be done before
* initStorage()).
*/
initThreadLabelTable();
#endif
-#if defined(PROFILING) || defined(DEBUG)
initProfiling1();
-#endif
/* start the virtual timer 'subsystem'. */
startTimer();
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
x86_init_fpu();
#endif
-#if defined(THREADED_RTS) && !defined(mingw32_HOST_OS)
+#if defined(THREADED_RTS)
ioManagerStart();
#endif
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
}
/* -----------------------------------------------------------------------------
/* 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
/* stop the ticker */
stopTimer();
-
+
/* reset the standard file descriptors to blocking mode */
resetNonBlockingFd(0);
resetNonBlockingFd(1);
// 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) {
reportCCSProfiling();
#endif
-#if defined(PROFILING) || defined(DEBUG)
endProfiling();
-#endif
#ifdef PROFILING
// Originally, this was in report_ccs_profiling(). Now, retainer
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