diff options
-rw-r--r-- | .mailmap | 1 | ||||
-rw-r--r-- | docs/users_guide/bugs.rst | 5 | ||||
-rw-r--r-- | rts/sm/MarkWeak.c | 8 | ||||
-rw-r--r-- | rts/sm/Scav.c | 4 |
4 files changed, 6 insertions, 12 deletions
@@ -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; |