Commit 37cb07db authored by sewardj's avatar sewardj
Browse files

[project @ 1999-10-26 17:15:39 by sewardj]

markStablePtrTable: correctly handle case when one stable ptr refers
to an indirection to an item referred to directly by a second
stable ptr (I think!).
parent bdb6474f
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
* $Id: Stable.c,v 1.8 1999/09/15 13:50:14 sof Exp $ * $Id: Stable.c,v 1.9 1999/10/26 17:15:39 sewardj Exp $
* *
* (c) The GHC Team, 1998-1999 * (c) The GHC Team, 1998-1999
* *
...@@ -199,7 +199,6 @@ getStablePtr(StgPtr p) ...@@ -199,7 +199,6 @@ getStablePtr(StgPtr p)
{ {
StgWord sn = lookupStableName(p); StgWord sn = lookupStableName(p);
StgWord weight, weight_2; StgWord weight, weight_2;
weight = stable_ptr_table[sn].weight; weight = stable_ptr_table[sn].weight;
if (weight == 0) { if (weight == 0) {
weight = (StgWord)1 << (BITS_IN(StgWord)-1); weight = (StgWord)1 << (BITS_IN(StgWord)-1);
...@@ -290,8 +289,10 @@ markStablePtrTable(rtsBool full) ...@@ -290,8 +289,10 @@ markStablePtrTable(rtsBool full)
(StgClosure *)p->addr = new; (StgClosure *)p->addr = new;
} else if ((P_)new != q) { } else if ((P_)new != q) {
removeHashTable(addrToStableHash, (W_)q, NULL); removeHashTable(addrToStableHash, (W_)q, NULL);
insertHashTable(addrToStableHash, (W_)new, if (!lookupHashTable(addrToStableHash, (W_)new)) {
(void *)(p - stable_ptr_table)); insertHashTable(addrToStableHash, (W_)new,
(void *)(p - stable_ptr_table));
}
(StgClosure *)p->addr = new; (StgClosure *)p->addr = new;
} }
IF_DEBUG(stable, fprintf(stderr,"Stable ptr %d still alive at %p, weight %d\n", p - stable_ptr_table, new, p->weight)); IF_DEBUG(stable, fprintf(stderr,"Stable ptr %d still alive at %p, weight %d\n", p - stable_ptr_table, new, p->weight));
......
Supports Markdown
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