+ stat_startExit and stat_endExit
+
+ These two measure the time taken in shutdownHaskell().
+ -------------------------------------------------------------------------- */
+
+void
+stat_startExit(void)
+{
+ MutElapsedStamp = elapsedtime();
+ MutElapsedTime = MutElapsedStamp - GCe_tot_time - InitElapsedStamp;
+ if (MutElapsedTime < 0) { MutElapsedTime = 0; } /* sometimes -0.00 */
+
+ /* for SMP, we don't know the mutator time yet, we have to inspect
+ * all the running threads to find out, and they haven't stopped
+ * yet. So we just timestamp MutUserTime at this point so we can
+ * calculate the EXIT time. The real MutUserTime is calculated
+ * in stat_exit below.
+ */
+#ifdef SMP
+ MutUserTime = usertime();
+#else
+ MutUserTime = usertime() - GC_tot_time - InitUserTime;
+ if (MutUserTime < 0) { MutUserTime = 0; }
+#endif
+}
+
+void
+stat_endExit(void)
+{
+#ifdef SMP
+ ExitUserTime = usertime() - MutUserTime;
+#else
+ ExitUserTime = usertime() - MutUserTime - GC_tot_time - InitUserTime;
+#endif
+ ExitElapsedTime = elapsedtime() - MutElapsedStamp;
+ if (ExitUserTime < 0.0) {
+ ExitUserTime = 0.0;
+ }
+ if (ExitElapsedTime < 0.0) {
+ ExitElapsedTime = 0.0;
+ }
+}
+
+/* -----------------------------------------------------------------------------