X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=includes%2Frts%2Fstorage%2FGC.h;h=9616d72d51f00a44a41b74915034911546353988;hb=f6ee1f315a7e7069b21a993fb058e00d06b73487;hp=1cd57c9045321be23853467daf8677988441d972;hpb=5270423a6afe69f1dc57e5e5a474812182718d40;p=ghc-hetmet.git diff --git a/includes/rts/storage/GC.h b/includes/rts/storage/GC.h index 1cd57c9..9616d72 100644 --- a/includes/rts/storage/GC.h +++ b/includes/rts/storage/GC.h @@ -53,24 +53,33 @@ * * ------------------------------------------------------------------------- */ -typedef struct step_ { - unsigned int no; // step number in this generation - unsigned int abs_no; // absolute step number +typedef struct nursery_ { + bdescr * blocks; + unsigned int n_blocks; +} nursery; - struct generation_ * gen; // generation this step belongs to - unsigned int gen_no; // generation number (cached) +typedef struct generation_ { + unsigned int no; // generation number - bdescr * blocks; // blocks in this step - unsigned int n_blocks; // number of blocks - unsigned int n_words; // number of words + bdescr * blocks; // blocks in this gen + unsigned int n_blocks; // number of blocks + unsigned int n_words; // number of used words - struct step_ * to; // destination step for live objects + bdescr * large_objects; // large objects (doubly linked) + unsigned int n_large_blocks; // no. of blocks used by large objs + unsigned int n_new_large_blocks; // count freshly allocated large objects - bdescr * large_objects; // large objects (doubly linked) - unsigned int n_large_blocks; // no. of blocks used by large objs + unsigned int max_blocks; // max blocks + bdescr *mut_list; // mut objects in this gen (not G0) - StgTSO * threads; // threads in this step + StgTSO * threads; // threads in this gen // linked via global_link + struct generation_ *to; // destination gen for live objects + + // stats information + unsigned int collections; + unsigned int par_collections; + unsigned int failed_promotions; // ------------------------------------ // Fields below are used during GC only @@ -85,13 +94,15 @@ typedef struct step_ { int mark; // mark (not copy)? (old gen only) int compact; // compact (not sweep)? (old gen only) - // During GC, if we are collecting this step, blocks and n_blocks + // During GC, if we are collecting this gen, blocks and n_blocks // 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 + bdescr * saved_mut_list; + bdescr * part_blocks; // partially-full scanned blocks unsigned int n_part_blocks; // count of above @@ -101,32 +112,11 @@ typedef struct step_ { bdescr * bitmap; // bitmap for compacting collection StgTSO * old_threads; - -} step; - - -typedef struct generation_ { - unsigned int no; // generation number - step * steps; // steps - unsigned int n_steps; // number of steps - unsigned int max_blocks; // max blocks in step 0 - bdescr *mut_list; // mut objects in this gen (not G0) - - // stats information - unsigned int collections; - unsigned int par_collections; - unsigned int failed_promotions; - - // temporary use during GC: - bdescr *saved_mut_list; } generation; extern generation * generations; - extern generation * g0; extern generation * oldest_gen; -extern step * all_steps; -extern nat total_steps; /* ----------------------------------------------------------------------------- Generic allocation @@ -177,10 +167,20 @@ void performMajorGC(void); The CAF table - used to let us revert CAFs in GHCi -------------------------------------------------------------------------- */ -void newCAF (StgClosure*); -void newDynCAF (StgClosure *); +void newCAF (StgRegTable *reg, StgClosure *); +void newDynCAF (StgRegTable *reg, StgClosure *); void revertCAFs (void); +// Request that all CAFs are retained indefinitely. +void setKeepCAFs (void); + +/* ----------------------------------------------------------------------------- + Stats + -------------------------------------------------------------------------- */ + +// Returns the total number of bytes allocated since the start of the program. +HsInt64 getAllocations (void); + /* ----------------------------------------------------------------------------- This is the write barrier for MUT_VARs, a.k.a. IORefs. A MUT_VAR_CLEAN object is not on the mutable list; a MUT_VAR_DIRTY @@ -194,11 +194,11 @@ void dirty_MUT_VAR(StgRegTable *reg, StgClosure *p); /* (needed when dynamic libraries are used). */ extern rtsBool keepCAFs; -INLINE_HEADER void initBdescr(bdescr *bd, step *step) +INLINE_HEADER void initBdescr(bdescr *bd, generation *gen, generation *dest) { - bd->step = step; - bd->gen_no = step->gen_no; - bd->dest = step->to; + bd->gen = gen; + bd->gen_no = gen->no; + bd->dest = dest; } #endif /* RTS_STORAGE_GC_H */