projects
/
ghc-hetmet.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
6a8f124
)
lag/drag/void: add an extra assertion, and some commentary
author
Simon Marlow
<simonmar@microsoft.com>
Thu, 23 Feb 2006 15:51:20 +0000
(15:51 +0000)
committer
Simon Marlow
<simonmar@microsoft.com>
Thu, 23 Feb 2006 15:51:20 +0000
(15:51 +0000)
ghc/rts/ProfHeap.c
patch
|
blob
|
history
diff --git
a/ghc/rts/ProfHeap.c
b/ghc/rts/ProfHeap.c
index
a50f2f0
..
312bee7
100644
(file)
--- a/
ghc/rts/ProfHeap.c
+++ b/
ghc/rts/ProfHeap.c
@@
-255,6
+255,7
@@
LDV_recordDead( StgClosure *c, nat size )
if (RtsFlags.ProfFlags.bioSelector == NULL) {
censuses[t].void_total += (int)size;
censuses[era].void_total -= (int)size;
if (RtsFlags.ProfFlags.bioSelector == NULL) {
censuses[t].void_total += (int)size;
censuses[era].void_total -= (int)size;
+ ASSERT(censuses[t].void_total < censuses[t].not_used);
} else {
id = closureIdentity(c);
ctr = lookupHashTable(censuses[t].hash, (StgWord)id);
} else {
id = closureIdentity(c);
ctr = lookupHashTable(censuses[t].hash, (StgWord)id);
@@
-653,6
+654,15
@@
aggregateCensusInfo( void )
int void_total, drag_total;
// Now we compute void_total and drag_total for each census
int void_total, drag_total;
// Now we compute void_total and drag_total for each census
+ // After the program has finished, the void_total field of
+ // each census contains the count of words that were *created*
+ // in this era and were eventually void. Conversely, if a
+ // void closure was destroyed in this era, it will be
+ // represented by a negative count of words in void_total.
+ //
+ // To get the count of live words that are void at each
+ // census, just propagate the void_total count forwards:
+
void_total = 0;
drag_total = 0;
for (t = 1; t < era; t++) { // note: start at 1, not 0
void_total = 0;
drag_total = 0;
for (t = 1; t < era; t++) { // note: start at 1, not 0
@@
-660,8
+670,15
@@
aggregateCensusInfo( void )
drag_total += censuses[t].drag_total;
censuses[t].void_total = void_total;
censuses[t].drag_total = drag_total;
drag_total += censuses[t].drag_total;
censuses[t].void_total = void_total;
censuses[t].drag_total = drag_total;
+
ASSERT( censuses[t].void_total <= censuses[t].not_used );
ASSERT( censuses[t].void_total <= censuses[t].not_used );
+ // should be true because: void_total is the count of
+ // live words that are void at this census, which *must*
+ // be less than the number of live words that have not
+ // been used yet.
+
ASSERT( censuses[t].drag_total <= censuses[t].used );
ASSERT( censuses[t].drag_total <= censuses[t].used );
+ // similar reasoning as above.
}
return;
}
return;