diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c index aee50cf47078e0a099c02a63c0d37441ea27c954..60376e59aaf589ed414e43e18ea16ad25dac3358 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 8fb546715157d659db45c9e28b1332ce0bf5dd8d..1a91e706fb8442c8a050dbe232a559b45c8f3475 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 103564a82a4d2c5e316ab181ce796df34a66bf3b..9d62acef371de6a7e85f4c9a3a1ff19e0ed7626c 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 86a111fca820d3feef99e964a92cc6920652abcc..a88073d1f833ad7b2c8a383b2c1ba1d7f20fd42f 100644 --- a/rts/sm/Storage.c +++ b/rts/sm/Storage.c @@ -302,7 +302,7 @@ exitStorage (void) { nonmovingExit(); updateNurseriesStats(); - stat_exit(); + stat_exitReport(); } void