summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.mailmap1
-rw-r--r--docs/users_guide/bugs.rst5
-rw-r--r--rts/sm/MarkWeak.c8
-rw-r--r--rts/sm/Scav.c4
4 files changed, 6 insertions, 12 deletions
diff --git a/.mailmap b/.mailmap
index 5ea062b4f6..81dec3d59c 100644
--- a/.mailmap
+++ b/.mailmap
@@ -242,6 +242,7 @@ Sven Panne <sven.panne@aedion.de> panne <unknown>
Sven Panne <sven.panne@aedion.de> sven.panne@aedion.de <unknown>
Sylvain Henry <hsyl20@gmail.com>
Sébastien Carlier <sebc@posse42.net> sebc <unknown>
+Takano Akio <tak@anoak.io> <aljee@hyper.cx>
Thorkil Naur <naur@post11.tele.dk> naur@post11.tele.dk <unknown>
Tibor Erdesz <erdeszt@gmail.com>
Tim Chevalier <chevalier@alum.wellesley.edu>
diff --git a/docs/users_guide/bugs.rst b/docs/users_guide/bugs.rst
index c4ac9ce1fe..ff8372589e 100644
--- a/docs/users_guide/bugs.rst
+++ b/docs/users_guide/bugs.rst
@@ -486,11 +486,6 @@ Bugs in GHC
data A :: Type where
B :: forall (a :: A). A
-- There is known to be maleficent interactions between weak references and
- laziness. Particularly, it has been observed that placing a thunk containing
- a reference to a weak reference inside of another weak reference may cause
- runtime crashes. See :ghc-ticket:`11108` for details.
-
.. _bugs-ghci:
Bugs in GHCi (the interactive GHC)
diff --git a/rts/sm/MarkWeak.c b/rts/sm/MarkWeak.c
index 2393536a74..7e3e1d5818 100644
--- a/rts/sm/MarkWeak.c
+++ b/rts/sm/MarkWeak.c
@@ -269,13 +269,7 @@ static rtsBool tidyWeakList(generation *gen)
gct->evac_gen_no = new_gen->no;
gct->failed_to_evac = rtsFalse;
- // evacuate the value and finalizer
- //
- // This WEAK object will not be considered by tidyWeakList
- // during this collection because it is in a generation >= N,
- // but it is on the mutable list so we must evacuate all of its
- // pointers because some of them may point into a younger
- // generation.
+ // evacuate the fields of the weak ptr
scavengeLiveWeak(w);
if (gct->failed_to_evac) {
diff --git a/rts/sm/Scav.c b/rts/sm/Scav.c
index b046f39ad5..7a799d6be6 100644
--- a/rts/sm/Scav.c
+++ b/rts/sm/Scav.c
@@ -1300,6 +1300,10 @@ scavenge_one(StgPtr p)
}
case WEAK:
+ // This WEAK object will not be considered by tidyWeakList during this
+ // collection because it is in a generation >= N, but it is on the
+ // mutable list so we must evacuate all of its pointers because some
+ // of them may point into a younger generation.
scavengeLiveWeak((StgWeak *)p);
break;