projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[project @ 1999-12-07 15:52:40 by simonmar]
[ghc-hetmet.git]
/
ghc
/
rts
/
Stable.c
diff --git
a/ghc/rts/Stable.c
b/ghc/rts/Stable.c
index
d0dbc59
..
2d280a4
100644
(file)
--- a/
ghc/rts/Stable.c
+++ b/
ghc/rts/Stable.c
@@
-1,5
+1,5
@@
/* -----------------------------------------------------------------------------
/* -----------------------------------------------------------------------------
- * $Id: Stable.c,v 1.5 1999/07/16 09:53:44 panne 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
*
@@
-187,6
+187,9
@@
static inline void
freeStableName(snEntry *sn)
{
ASSERT(sn->sn_obj == NULL);
freeStableName(snEntry *sn)
{
ASSERT(sn->sn_obj == NULL);
+ if (sn->addr != NULL) {
+ removeHashTable(addrToStableHash, (W_)sn->addr, NULL);
+ }
sn->addr = (P_)stable_ptr_free;
stable_ptr_free = sn;
}
sn->addr = (P_)stable_ptr_free;
stable_ptr_free = sn;
}
@@
-196,7
+199,6
@@
getStablePtr(StgPtr p)
{
StgWord sn = lookupStableName(p);
StgWord weight, weight_2;
{
StgWord sn = lookupStableName(p);
StgWord weight, weight_2;
-
weight = stable_ptr_table[sn].weight;
if (weight == 0) {
weight = (StgWord)1 << (BITS_IN(StgWord)-1);
weight = stable_ptr_table[sn].weight;
if (weight == 0) {
weight = (StgWord)1 << (BITS_IN(StgWord)-1);
@@
-228,7
+230,11
@@
enlargeStablePtrTable(void)
stable_ptr_table = stgMallocWords(SPT_size * sizeof(snEntry),
"initStablePtrTable");
stable_ptr_table = stgMallocWords(SPT_size * sizeof(snEntry),
"initStablePtrTable");
- initFreeList(stable_ptr_table,INIT_SPT_SIZE,NULL);
+ /* we don't use index 0 in the stable name table, because that
+ * would conflict with the hash table lookup operations which
+ * return NULL if an entry isn't found in the hash table.
+ */
+ initFreeList(stable_ptr_table+1,INIT_SPT_SIZE-1,NULL);
addrToStableHash = allocHashTable();
}
else {
addrToStableHash = allocHashTable();
}
else {
@@
-266,9
+272,10
@@
markStablePtrTable(rtsBool full)
end_stable_ptr_table = &stable_ptr_table[SPT_size];
end_stable_ptr_table = &stable_ptr_table[SPT_size];
- /* Mark all the stable *pointers* (not stable names)
+ /* Mark all the stable *pointers* (not stable names).
+ * _starting_ at index 1; index 0 is unused.
*/
*/
- for (p = stable_ptr_table; p < end_stable_ptr_table; p++) {
+ for (p = stable_ptr_table+1; p < end_stable_ptr_table; p++) {
q = p->addr;
/* internal pointers or NULL are free slots
*/
q = p->addr;
/* internal pointers or NULL are free slots
*/
@@
-282,8
+289,10
@@
markStablePtrTable(rtsBool full)
(StgClosure *)p->addr = new;
} else if ((P_)new != q) {
removeHashTable(addrToStableHash, (W_)q, NULL);
(StgClosure *)p->addr = new;
} else if ((P_)new != q) {
removeHashTable(addrToStableHash, (W_)q, NULL);
- insertHashTable(addrToStableHash, (W_)new,
- (void *)(p - stable_ptr_table));
+ if (!lookupHashTable(addrToStableHash, (W_)new)) {
+ insertHashTable(addrToStableHash, (W_)new,
+ (void *)(p - stable_ptr_table));
+ }
(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));
(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));
@@
-323,7
+332,8
@@
gcStablePtrTable(rtsBool full)
end_stable_ptr_table = &stable_ptr_table[SPT_size];
end_stable_ptr_table = &stable_ptr_table[SPT_size];
- for (p = stable_ptr_table; p < end_stable_ptr_table; p++) {
+ /* NOTE: _starting_ at index 1; index 0 is unused. */
+ for (p = stable_ptr_table + 1; p < end_stable_ptr_table; p++) {
/* Update the pointer to the StableName object, if there is one */
if (p->sn_obj != NULL) {
/* Update the pointer to the StableName object, if there is one */
if (p->sn_obj != NULL) {
@@
-347,9
+357,15
@@
gcStablePtrTable(rtsBool full)
(StgClosure *)new = isAlive((StgClosure *)q);
IF_DEBUG(stable, fprintf(stderr,"Stable name %d still alive at %p, weight %d\n", p - stable_ptr_table, new, p->weight));
(StgClosure *)new = isAlive((StgClosure *)q);
IF_DEBUG(stable, fprintf(stderr,"Stable name %d still alive at %p, weight %d\n", p - stable_ptr_table, new, p->weight));
- p->addr = new;
- if (new != NULL) {
- /* Re-hash this stable name */
+ if (new == NULL) {
+ /* The target has been garbage collected. Remove its
+ * entry from the hash table.
+ */
+ removeHashTable(addrToStableHash, (W_)q, NULL);
+
+ } else {
+ /* Target still alive, Re-hash this stable name
+ */
if (full) {
insertHashTable(addrToStableHash, (W_)new, (void *)(p - stable_ptr_table));
} else if (new != q) {
if (full) {
insertHashTable(addrToStableHash, (W_)new, (void *)(p - stable_ptr_table));
} else if (new != q) {
@@
-357,6
+373,11
@@
gcStablePtrTable(rtsBool full)
insertHashTable(addrToStableHash, (W_)new, (void *)(p - stable_ptr_table));
}
}
insertHashTable(addrToStableHash, (W_)new, (void *)(p - stable_ptr_table));
}
}
+
+ /* finally update the address of the target to point to its
+ * new location.
+ */
+ p->addr = new;
}
}
}
}
}
}