summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2020-10-24 19:51:15 -0400
committerBen Gamari <ben@well-typed.com>2020-12-01 12:48:55 -0500
commit9ad6e1f12e99330adeacc3b6eea52c6f26324a46 (patch)
treea76c80902566feff1b5b7e96226420dce9565465
parent953de20fc9980fa0768732cab42692733f8c0bfa (diff)
downloadhaskell-9ad6e1f12e99330adeacc3b6eea52c6f26324a46.tar.gz
rts: Tear down stats_mutex after exitHeapProfiling
Since the latter wants to call getRTSStats.
-rw-r--r--rts/RtsStartup.c3
-rw-r--r--rts/Stats.c12
-rw-r--r--rts/Stats.h1
-rw-r--r--rts/sm/Storage.c2
4 files changed, 13 insertions, 5 deletions
diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c
index aee50cf470..60376e59aa 100644
--- a/rts/RtsStartup.c
+++ b/rts/RtsStartup.c
@@ -518,6 +518,9 @@ hs_exit_(bool wait_foreign)
shutdownAsyncIO(wait_foreign);
#endif
+ /* tear down statistics subsystem */
+ stat_exit();
+
// Finally, free all our storage. However, we only free the heap
// memory if we have waited for foreign calls to complete;
// otherwise a foreign call in progress may still be referencing
diff --git a/rts/Stats.c b/rts/Stats.c
index 8fb5467151..1a91e706fb 100644
--- a/rts/Stats.c
+++ b/rts/Stats.c
@@ -1220,7 +1220,7 @@ static void report_one_line(const RTSSummaryStats * sum)
}
void
-stat_exit (void)
+stat_exitReport (void)
{
RTSSummaryStats sum;
init_RTSSummaryStats(&sum);
@@ -1425,9 +1425,6 @@ stat_exit (void)
}
}
RELEASE_LOCK(&stats_mutex);
-#if defined(THREADED_RTS)
- closeMutex(&stats_mutex);
-#endif
statsFlush();
statsClose();
@@ -1451,6 +1448,13 @@ stat_exit (void)
RELEASE_LOCK(&all_tasks_mutex);
}
+void stat_exit()
+{
+#if defined(THREADED_RTS)
+ closeMutex(&stats_mutex);
+#endif
+}
+
/* Note [Work Balance]
----------------------
Work balance is a measure of how evenly the work done during parallel garbage
diff --git a/rts/Stats.h b/rts/Stats.h
index 103564a82a..9d62acef37 100644
--- a/rts/Stats.h
+++ b/rts/Stats.h
@@ -58,6 +58,7 @@ void stat_endHeapCensus(void);
void stat_startExit(void);
void stat_endExit(void);
+void stat_exitReport(void);
void stat_exit(void);
void stat_workerStop(void);
diff --git a/rts/sm/Storage.c b/rts/sm/Storage.c
index 86a111fca8..a88073d1f8 100644
--- a/rts/sm/Storage.c
+++ b/rts/sm/Storage.c
@@ -302,7 +302,7 @@ exitStorage (void)
{
nonmovingExit();
updateNurseriesStats();
- stat_exit();
+ stat_exitReport();
}
void