From 0ec1bd64b3317febe8c018041f538f1c83135e6c Mon Sep 17 00:00:00 2001 From: Ben Gamari <bgamari.foss@gmail.com> Date: Sat, 7 Apr 2018 13:32:04 -0400 Subject: [PATCH] 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 (cherry picked from commit d5f6d7a03d66a93ec05a90948126feffc9279dc6) --- rts/RetainerProfile.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/rts/RetainerProfile.c b/rts/RetainerProfile.c index 7a9b9ccd5427..67cba8393ee8 100644 --- a/rts/RetainerProfile.c +++ b/rts/RetainerProfile.c @@ -426,7 +426,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. @@ -1706,6 +1706,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; -- GitLab