[commit: ghc] master: rts/RetainerProfile: Handle BLOCKING_QUEUES (d5f6d7a)

git at git.haskell.org git at git.haskell.org
Tue Apr 10 15:36:30 UTC 2018


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/d5f6d7a03d66a93ec05a90948126feffc9279dc6/ghc

>---------------------------------------------------------------

commit d5f6d7a03d66a93ec05a90948126feffc9279dc6
Author: Ben Gamari <bgamari.foss at gmail.com>
Date:   Sat Apr 7 13:32:04 2018 -0400

    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


>---------------------------------------------------------------

d5f6d7a03d66a93ec05a90948126feffc9279dc6
 rts/RetainerProfile.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/rts/RetainerProfile.c b/rts/RetainerProfile.c
index 79bb7e3..67a6da9 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;



More information about the ghc-commits mailing list