Commit d5f6d7a0 authored by Ben Gamari's avatar Ben Gamari Committed by Ben Gamari

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
parent 51616091
......@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment