diff options
author | Ömer Sinan Ağacan <omeragacan@gmail.com> | 2018-09-24 16:21:27 +0300 |
---|---|---|
committer | Ömer Sinan Ağacan <omeragacan@gmail.com> | 2018-09-24 16:21:50 +0300 |
commit | d90946cea1357d3e99805c27dab1e811785a4088 (patch) | |
tree | d0de72599c28102b28bd532d25979bb5533577d6 | |
parent | e68b439fe5de61b9a2ca51af472185c62ccb8b46 (diff) | |
download | haskell-d90946cea1357d3e99805c27dab1e811785a4088.tar.gz |
Fix a MSG_BLACKHOLE sanity check, add some comments
Reviewers: simonmar, bgamari, erikd
Reviewed By: simonmar
Subscribers: rwbarton, carter
GHC Trac Issues: #15508
Differential Revision: https://phabricator.haskell.org/D5178
-rw-r--r-- | includes/rts/storage/Closures.h | 7 | ||||
-rw-r--r-- | rts/sm/Sanity.c | 8 |
2 files changed, 12 insertions, 3 deletions
diff --git a/includes/rts/storage/Closures.h b/includes/rts/storage/Closures.h index 15231e01f0..7db67c708e 100644 --- a/includes/rts/storage/Closures.h +++ b/includes/rts/storage/Closures.h @@ -130,10 +130,13 @@ typedef struct { typedef struct StgBlockingQueue_ { StgHeader header; - struct StgBlockingQueue_ *link; // here so it looks like an IND + struct StgBlockingQueue_ *link; + // here so it looks like an IND, to be able to skip the queue without + // deleting it (done in wakeBlockingQueue()) StgClosure *bh; // the BLACKHOLE StgTSO *owner; struct MessageBlackHole_ *queue; + // holds TSOs blocked on `bh` } StgBlockingQueue; typedef struct { @@ -400,6 +403,8 @@ typedef struct MessageThrowTo_ { typedef struct MessageBlackHole_ { StgHeader header; struct MessageBlackHole_ *link; + // here so it looks like an IND, to be able to skip the message without + // deleting it (done in throwToMsg()) StgTSO *tso; StgClosure *bh; } MessageBlackHole; diff --git a/rts/sm/Sanity.c b/rts/sm/Sanity.c index 8d4171b1cd..c6861f4134 100644 --- a/rts/sm/Sanity.c +++ b/rts/sm/Sanity.c @@ -292,8 +292,12 @@ checkClosure( const StgClosure* p ) ASSERT(LOOKS_LIKE_CLOSURE_PTR(bq->bh)); ASSERT(get_itbl((StgClosure *)(bq->owner))->type == TSO); - ASSERT(bq->queue == (MessageBlackHole*)END_TSO_QUEUE - || bq->queue->header.info == &stg_MSG_BLACKHOLE_info); + ASSERT(// A bq with no other blocked TSOs: + bq->queue == (MessageBlackHole*)END_TSO_QUEUE || + // A bq with blocked TSOs in its queue: + bq->queue->header.info == &stg_MSG_BLACKHOLE_info || + // A bq with a deleted (in throwToMsg()) MSG_BLACKHOLE: + bq->queue->header.info == &stg_IND_info); ASSERT(bq->link == (StgBlockingQueue*)END_TSO_QUEUE || get_itbl((StgClosure *)(bq->link))->type == IND || get_itbl((StgClosure *)(bq->link))->type == BLOCKING_QUEUE); |