#include "Stats.h" /* initStats */
#include "STM.h" /* initSTM */
#include "Signals.h"
+#include "RtsSignals.h"
#include "Timer.h" /* startTimer, stopTimer */
#include "Weak.h"
#include "Ticky.h"
hs_add_root(void (*init_root)(void))
{
bdescr *bd;
-#ifdef SMP
- Capability cap;
-#else
-#define cap MainCapability
-#endif
nat init_sp;
+ Capability *cap = &MainCapability;
if (hs_init_count <= 0) {
barf("hs_add_root() must be called after hs_init()");
init_stack[--init_sp] = (F_)init_root;
}
- cap.r.rSp = (P_)(init_stack + init_sp);
- StgRun((StgFunPtr)stg_init, &cap.r);
+ cap->r.rSp = (P_)(init_stack + init_sp);
+ StgRun((StgFunPtr)stg_init, &cap->r);
freeGroup_lock(bd);
hs_exit(void)
{
if (hs_init_count <= 0) {
- barf("too many hs_exit()s");
+ errorBelch("warning: too many hs_exit()s");
+ return;
}
hs_init_count--;
if (hs_init_count > 0) {
/* stop timing the shutdown, we're about to print stats */
stat_endExit();
- /* clean up things from the storage manager's point of view.
- * also outputs the stats (+RTS -s) info.
- */
+ // clean up things from the storage manager's point of view.
+ // also outputs the stats (+RTS -s) info.
exitStorage();
#ifdef RTS_GTK_FRONTPANEL
// during endProfiling().
fclose(prof_file);
#endif
-
+
#if defined(TICKY_TICKY)
if (RtsFlags.TickyFlags.showTickyStats) PrintTickyInfo();
#endif
#if defined(mingw32_HOST_OS)
shutdownAsyncIO();
#endif
+
+ // Finally, free all our storage.
+ freeStorage();
}
// Compatibility interfaces