*
* ------------------------------------------------------------------------- */
+// 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 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 int n_new_large_blocks; // count freshly allocated 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
- bdescr *mut_list; // mut objects in this gen (not G0)
+ memcount max_blocks; // max blocks
StgTSO * threads; // threads in this gen
// linked via global_link
#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
// 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 * saved_mut_list;
-
- 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
void freeExec (void *p);
// Used by GC checks in external .cmm code:
-extern nat alloc_blocks_lim;
+extern nat large_alloc_lim;
/* -----------------------------------------------------------------------------
Performing Garbage Collection
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
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 */