summaryrefslogtreecommitdiff
path: root/rts
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2015-09-23 10:01:23 +0100
committerSimon Marlow <marlowsd@gmail.com>2015-09-24 08:43:56 +0100
commit2440e3c6b479ac532e2660374a78c8482e903bed (patch)
tree3176ad7057f226a57186c505d4cd5ffc2f5b5283 /rts
parent39a262e53bab3b7cf827fa9f22226da5fca055be (diff)
downloadhaskell-2440e3c6b479ac532e2660374a78c8482e903bed.tar.gz
Fix a bug with mallocForeignPtr and finalizers (#10904)
Summary: See Note [MallocPtr finalizers] Test Plan: validate; new test T10904 Reviewers: ezyang, bgamari, austin, hvr, rwbarton Subscribers: thomie Differential Revision: https://phabricator.haskell.org/D1275
Diffstat (limited to 'rts')
-rw-r--r--rts/sm/MarkWeak.c5
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;