*
* ---------------------------------------------------------------------------*/
-#include "PosixSource.h"
+// PAPI uses caddr_t, which is not POSIX
+// #include "PosixSource.h"
+
#include "Rts.h"
#include "RtsAPI.h"
#include "RtsUtils.h"
#include "RtsFlags.h"
#include "OSThreads.h"
-#include "Storage.h" /* initStorage, exitStorage */
#include "Schedule.h" /* initScheduler */
#include "Stats.h" /* initStats */
#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 "BlockAlloc.h"
#include "Trace.h"
#include "RtsTypeable.h"
+#include "Stable.h"
+#include "Hpc.h"
#if defined(RTS_GTK_FRONTPANEL)
#include "FrontPanel.h"
# include "LLC.h"
#endif
-#if defined(mingw32_HOST_OS)
+#if defined(mingw32_HOST_OS) && !defined(THREADED_RTS)
#include "win32/AsyncIO.h"
#endif
#include <signal.h>
#endif
+#if USE_PAPI
+#include "Papi.h"
+#endif
+
// Count of how many outstanding hs_init()s there have been.
static int hs_init_count = 0;
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();
argv++; argc--;
#endif
+ /* Initialise the performance tracking library */
+#ifdef USE_PAPI
+ {
+ 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;
+ if ((err = PAPI_thread_init(osThreadId)) < 0) {
+ barf("PAPI_thread_init: %d",err);
+ }
+ }
+#endif
+#endif
+
/* Set the RTS flags to default values. */
+
initRtsFlagsDefaults();
/* Call the user hook to reset defaults, if present */
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
freeGroup_lock(bd);
+ 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.
/* start timing the shutdown */
stat_startExit();
-#if defined(THREADED_RTS) && !defined(mingw32_HOST_OS)
+#if defined(RTS_USER_SIGNALS)
+ freeSignalHandlers();
+#endif
+
+#if defined(THREADED_RTS)
ioManagerDie();
#endif
/* stop timing the shutdown, we're about to print stats */
stat_endExit();
+ /* shutdown the hpc support (if needed) */
+ exitHpc();
+
// clean up things from the storage manager's point of view.
// 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();
+#if defined(PROFILING) || defined(DEBUG)
+ freeProfiling1();
+#endif
+
+#if defined(DEBUG)
+ /* free the thread label table */
+ freeThreadLabelTable();
+#endif
+
/* free hash table storage */
exitHashTable();
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