On 13/11/2012 16:43, Henrique Ferreiro wrote:
commit 65e46f144f3d8b18de7264b0b099086153c68d6c

    Author: Simon Marlow <marlo...@gmail.com <mailto:marlo...@gmail.com>>
    Date:   Mon Nov 5 15:43:21 2012 +0000

         a fix for checkTSO(): the TSO could be a WHITEHOLE

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

      rts/sm/Sanity.c |   13 ++++++++++---
      1 files changed, 10 insertions(+), 3 deletions(-)

    diff --git a/rts/sm/Sanity.c b/rts/sm/Sanity.c
    index 6237662..a760e57 100644
    --- a/rts/sm/Sanity.c
    +++ b/rts/sm/Sanity.c
    @@ -499,6 +499,9 @@ checkSTACK (StgStack *stack)
      void
      checkTSO(StgTSO *tso)
      {
    +    StgTSO *next;
    +    const StgInfoTable *info;
    +
          if (tso->what_next == ThreadKilled) {
            /* The garbage collector doesn't bother following any pointers
             * from dead threads, so don't check sanity here.
    @@ -506,9 +509,13 @@ checkTSO(StgTSO *tso)
            return;
          }

    -    ASSERT(tso->_link == END_TSO_QUEUE ||
    -           tso->_link->header.info <http://header.info> ==
    &stg_MVAR_TSO_QUEUE_info ||
    -           tso->_link->header.info <http://header.info> ==
    &stg_TSO_info);
    +    next = tso->_link;
    +    info = (const StgInfoTable*) tso->header.info <http://header.info>;
    +
    +    ASSERT(next == END_TSO_QUEUE ||
    +           info == &stg_MVAR_TSO_QUEUE_info ||
    +           info == &stg_TSO_info ||
    +           info == &stg_WHITEHOLE_info); // happens due to STM
    doing lockTSO()

          if (   tso->why_blocked == BlockedOnMVar
             || tso->why_blocked == BlockedOnBlackHole


I may be missing something but in the original code you are checking the
info table of tso->_link and, in the new one, the info table of tso.

Well spotted, thanks.

Cheers,
        Simon


_______________________________________________
Cvs-ghc mailing list
Cvs-ghc@haskell.org
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to