diff options
author | Ben Gamari <bgamari.foss@gmail.com> | 2018-04-07 13:32:04 -0400 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2018-04-10 11:35:59 -0400 |
commit | d5f6d7a03d66a93ec05a90948126feffc9279dc6 (patch) | |
tree | 1947feeca508d85f207792e2ef23e4b04123b084 /rts/RetainerProfile.c | |
parent | 5161609117c16cb7b29b2b8b1cd41e74341d4137 (diff) | |
download | haskell-d5f6d7a03d66a93ec05a90948126feffc9279dc6.tar.gz |
rts/RetainerProfile: Handle BLOCKING_QUEUES
push() considers BLOCKING_QUEUES to be an invalid closure type which
should never be present on the stack. However, retainClosure made no
accomodation for this and ended up pushing such a closure. This lead
to #14947.
Test Plan: Validate
Reviewers: simonmar, erikd
Reviewed By: simonmar
Subscribers: thomie, carter, RyanGlScott
GHC Trac Issues: #14947
Differential Revision: https://phabricator.haskell.org/D4538
Diffstat (limited to 'rts/RetainerProfile.c')
-rw-r--r-- | rts/RetainerProfile.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/rts/RetainerProfile.c b/rts/RetainerProfile.c index 79bb7e3cfb..67a6da93cd 100644 --- a/rts/RetainerProfile.c +++ b/rts/RetainerProfile.c @@ -424,7 +424,7 @@ find_srt( stackPos *info ) * push() pushes a stackElement representing the next child of *c * onto the traverse stack. If *c has no child, *first_child is set * to NULL and nothing is pushed onto the stack. If *c has only one - * child, *c_chlid is set to that child and nothing is pushed onto + * child, *c_child is set to that child and nothing is pushed onto * the stack. If *c has more than two children, *first_child is set * to the first child and a stackElement representing the second * child is pushed onto the stack. @@ -1695,6 +1695,15 @@ inner_loop: goto loop; } + case BLOCKING_QUEUE: + { + StgBlockingQueue *bq = (StgBlockingQueue *)c; + retainClosure((StgClosure*) bq->link, c, c_child_r); + retainClosure((StgClosure*) bq->bh, c, c_child_r); + retainClosure((StgClosure*) bq->owner, c, c_child_r); + goto loop; + } + case PAP: { StgPAP *pap = (StgPAP *)c; |