summaryrefslogtreecommitdiff
path: root/rts/RetainerProfile.c
diff options
context:
space:
mode:
authorBen Gamari <bgamari.foss@gmail.com>2018-04-07 13:32:04 -0400
committerBen Gamari <ben@smart-cactus.org>2018-04-10 11:35:59 -0400
commitd5f6d7a03d66a93ec05a90948126feffc9279dc6 (patch)
tree1947feeca508d85f207792e2ef23e4b04123b084 /rts/RetainerProfile.c
parent5161609117c16cb7b29b2b8b1cd41e74341d4137 (diff)
downloadhaskell-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.c11
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;