diff options
Diffstat (limited to 'rts/sm/MarkWeak.c')
-rw-r--r-- | rts/sm/MarkWeak.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/rts/sm/MarkWeak.c b/rts/sm/MarkWeak.c index 60ac53f4b0..9a32198c99 100644 --- a/rts/sm/MarkWeak.c +++ b/rts/sm/MarkWeak.c @@ -191,6 +191,11 @@ static void collectDeadWeakPtrs (generation *gen) { StgWeak *w, *next_w; for (w = gen->old_weak_ptr_list; w != NULL; w = next_w) { + // If we have C finalizers, keep the value alive for this GC. + // See Note [MallocPtr finalizers] in GHC.ForeignPtr, and #10904 + if (w->cfinalizers != &stg_NO_FINALIZER_closure) { + evacuate(&w->value); + } evacuate(&w->finalizer); next_w = w->link; w->link = dead_weak_ptr_list; |