summaryrefslogtreecommitdiff
path: root/rts/RtsStartup.c
diff options
context:
space:
mode:
authorTakano Akio <aljee@hyper.cx>2013-03-11 18:51:05 +0900
committerIan Lynagh <ian@well-typed.com>2013-06-15 16:41:02 +0100
commitfe652a8b56c864167ecf1fac899bb3d99363dfcf (patch)
tree888acad55c4cc1a9eee790f0c5404feed34c5fec /rts/RtsStartup.c
parent6770663f764db76dbb7138ccb3aea0527d194151 (diff)
downloadhaskell-fe652a8b56c864167ecf1fac899bb3d99363dfcf.tar.gz
Maintain per-generation lists of weak pointers (#7847)
Diffstat (limited to 'rts/RtsStartup.c')
-rw-r--r--rts/RtsStartup.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c
index d8c2058526..39c5ef1f94 100644
--- a/rts/RtsStartup.c
+++ b/rts/RtsStartup.c
@@ -295,6 +295,8 @@ hs_add_root(void (*init_root)(void) STG_UNUSED)
static void
hs_exit_(rtsBool wait_foreign)
{
+ nat g;
+
if (hs_init_count <= 0) {
errorBelch("warning: too many hs_exit()s");
return;
@@ -325,7 +327,9 @@ hs_exit_(rtsBool wait_foreign)
exitScheduler(wait_foreign);
/* run C finalizers for all active weak pointers */
- runAllCFinalizers(weak_ptr_list);
+ for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
+ runAllCFinalizers(generations[g].weak_ptr_list);
+ }
#if defined(RTS_USER_SIGNALS)
if (RtsFlags.MiscFlags.install_signal_handlers) {