[project @ 2001-03-02 14:28:44 by simonmar]
authorsimonmar <unknown>
Fri, 2 Mar 2001 14:28:44 +0000 (14:28 +0000)
committersimonmar <unknown>
Fri, 2 Mar 2001 14:28:44 +0000 (14:28 +0000)
Yet another good bug (I'm on a roll today! :-)

When squeezing update frames, make sure the updatee pointers aren't
identical before updating one to point to the other.  This is mostly
harmless, but in one example I have caused the program to go into an
infinite loop rather than fall down a black hole.

To be merged into the 4.08 branch.

ghc/rts/GC.c

index a1bbf56..63526f1 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: GC.c,v 1.96 2001/02/11 17:51:07 simonmar Exp $
+ * $Id: GC.c,v 1.97 2001/03/02 14:28:44 simonmar Exp $
  *
  * (c) The GHC Team 1998-1999
  *
@@ -3342,7 +3342,10 @@ threadSqueezeStack(StgTSO *tso)
        * sorted out?  oh yes: we aren't counting each enter properly
        * in this case.  See the log somewhere.  KSW 1999-04-21
        */
-      UPD_IND_NOLOCK(updatee_bypass, updatee_keep); /* this wakes the threads up */
+      if (updatee_bypass != updatee_keep) {
+         /* this wakes the threads up */
+         UPD_IND_NOLOCK(updatee_bypass, updatee_keep);
+      }
       
       sp = (P_)frame - 1;      /* sp = stuff to slide */
       displacement += sizeofW(StgUpdateFrame);