X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=includes%2Frts%2Fstorage%2FGC.h;h=3c6e6f6e26bba5a1797ae512ad5d4553250404c2;hp=c412c96617322209667f589e4c52943ab2702943;hb=b2524b3960999fffdb3767900f58825903f6560f;hpb=329077220af83860d5dd6891649cb1058b5bbaa6 diff --git a/includes/rts/storage/GC.h b/includes/rts/storage/GC.h index c412c96..3c6e6f6 100644 --- a/includes/rts/storage/GC.h +++ b/includes/rts/storage/GC.h @@ -53,24 +53,32 @@ * * ------------------------------------------------------------------------- */ +// A count of blocks needs to store anything up to the size of memory +// divided by the block size. The safest thing is therefore to use a +// type that can store the full range of memory addresses, +// ie. StgWord. Note that we have had some tricky int overflows in a +// couple of cases caused by using ints rather than longs (e.g. #5086) + +typedef StgWord memcount; + typedef struct nursery_ { bdescr * blocks; - unsigned int n_blocks; + memcount n_blocks; } nursery; typedef struct generation_ { unsigned int no; // generation number bdescr * blocks; // blocks in this gen - unsigned int n_blocks; // number of blocks - unsigned int n_words; // number of used words + memcount n_blocks; // number of blocks + memcount n_words; // number of used words bdescr * large_objects; // large objects (doubly linked) - unsigned int n_large_blocks; // no. of blocks used by large objs - unsigned long n_new_large_words; // words of new large objects + memcount n_large_blocks; // no. of blocks used by large objs + memcount n_new_large_words; // words of new large objects // (for allocation stats) - unsigned int max_blocks; // max blocks + memcount max_blocks; // max blocks StgTSO * threads; // threads in this gen // linked via global_link @@ -87,7 +95,7 @@ typedef struct generation_ { #if defined(THREADED_RTS) char pad[128]; // make sure the following is // on a separate cache line. - SpinLock sync_large_objects; // lock for large_objects + SpinLock sync; // lock for large_objects // and scavenged_large_objects #endif @@ -98,14 +106,11 @@ typedef struct generation_ { // are copied into the following two fields. After GC, these blocks // are freed. bdescr * old_blocks; // bdescr of first from-space block - unsigned int n_old_blocks; // number of blocks in from-space - unsigned int live_estimate; // for sweeping: estimate of live data + memcount n_old_blocks; // number of blocks in from-space + memcount live_estimate; // for sweeping: estimate of live data - bdescr * part_blocks; // partially-full scanned blocks - unsigned int n_part_blocks; // count of above - bdescr * scavenged_large_objects; // live large objs after GC (d-link) - unsigned int n_scavenged_large_blocks; // size (not count) of above + memcount n_scavenged_large_blocks; // size (not count) of above bdescr * bitmap; // bitmap for compacting collection @@ -194,9 +199,9 @@ extern rtsBool keepCAFs; INLINE_HEADER void initBdescr(bdescr *bd, generation *gen, generation *dest) { - bd->gen = gen; - bd->gen_no = gen->no; - bd->dest = dest; + bd->gen = gen; + bd->gen_no = gen->no; + bd->dest_no = dest->no; } #endif /* RTS_STORAGE_GC_H */