Commit c1580e72 authored by Simon Marlow's avatar Simon Marlow

More sanity checking for the TSO write barrier

Check that all threads marked as dirty are really on the mutable list.
parent 886d3dbf
......@@ -266,6 +266,8 @@
*/
#define TSO_LINK_DIRTY 32
#define TSO_MARKED 64
/* -----------------------------------------------------------------------------
RET_DYN stack frames
-------------------------------------------------------------------------- */
......
......@@ -793,6 +793,14 @@ checkGlobalTSOList (rtsBool checkTSOs)
ASSERT(get_itbl(tso)->type == TSO);
if (checkTSOs)
checkTSO(tso);
// If this TSO is dirty and in an old generation, it better
// be on the mutable list.
if (tso->what_next == ThreadRelocated) continue;
if (tso->flags & (TSO_DIRTY|TSO_LINK_DIRTY)) {
ASSERT(Bdescr((P_)tso)->gen_no == 0 || tso->flags & TSO_MARKED);
tso->flags &= ~TSO_MARKED;
}
}
}
}
......@@ -812,8 +820,25 @@ checkMutableList( bdescr *mut_bd, nat gen )
for (q = bd->start; q < bd->free; q++) {
p = (StgClosure *)*q;
ASSERT(!HEAP_ALLOCED(p) || Bdescr((P_)p)->gen_no == gen);
if (get_itbl(p)->type == TSO) {
((StgTSO *)p)->flags |= TSO_MARKED;
}
}
}
}
void
checkMutableLists (void)
{
nat g, i;
for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
checkMutableList(generations[g].mut_list, g);
for (i = 0; i < n_capabilities; i++) {
checkMutableList(capabilities[i].mut_lists[g], g);
}
}
checkGlobalTSOList(rtsTrue);
}
/*
......
......@@ -29,6 +29,7 @@ extern StgOffset checkStackFrame ( StgPtr sp );
extern StgOffset checkClosure ( StgClosure* p );
extern void checkMutableList ( bdescr *bd, nat gen );
extern void checkMutableLists (void);
#if defined(GRAN)
extern void checkTSOsSanity(void);
......
......@@ -268,8 +268,9 @@ GarbageCollect ( rtsBool force_major_gc )
memInventory(traceClass(DEBUG_gc));
#endif
// check stack sanity *before* GC (ToDo: check all threads)
// check stack sanity *before* GC
IF_DEBUG(sanity, checkFreeListSanity());
IF_DEBUG(sanity, checkMutableLists());
// Initialise all our gc_thread structures
for (t = 0; t < n_gc_threads; t++) {
......
Markdown is supported
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