diff options
author | Takano Akio <tak@anoak.io> | 2016-05-12 15:45:44 +0200 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2016-05-12 17:33:39 +0200 |
commit | 7c0b595e55d31f9f89e6dede11981e942c5bb32f (patch) | |
tree | c702a17798f2a9629d648e01eed90b4fe0819057 | |
parent | 0c0129b6a82a87a9bba19f27a4b19fec9ccc5a8d (diff) | |
download | haskell-7c0b595e55d31f9f89e6dede11981e942c5bb32f.tar.gz |
Fix comments about scavenging WEAK objects
This is a follow-up of D2189. If fixes some comments, deletes a section
in the User's Guide about the bug, and updates .mailmap as suggested on
the WorkinConventions wiki page.
Test Plan: It compiles.
Reviewers: austin, simonmar, bgamari
Reviewed By: bgamari
Subscribers: thomie
Differential Revision: https://phabricator.haskell.org/D2202
GHC Trac Issues: #11108
-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; |