[project @ 2001-07-23 17:23:19 by simonmar]
[ghc-hetmet.git] / ghc / includes / StgStorage.h
1 /* -----------------------------------------------------------------------------
2  * $Id: StgStorage.h,v 1.9 2001/07/23 17:23:19 simonmar Exp $
3  *
4  * (c) The GHC Team, 1998-1999
5  *
6  * STG Storage Manager Interface
7  *
8  * ---------------------------------------------------------------------------*/
9
10 #ifndef STGSTORAGE_H
11 #define STGSTORAGE_H
12
13 /* GENERATION GC NOTES
14  *
15  * We support an arbitrary number of generations, with an arbitrary number
16  * of steps per generation.  Notes (in no particular order):
17  *
18  *       - all generations except the oldest should have two steps.  This gives
19  *         objects a decent chance to age before being promoted, and in
20  *         particular will ensure that we don't end up with too many
21  *         thunks being updated in older generations.
22  *
23  *       - the oldest generation has one step.  There's no point in aging
24  *         objects in the oldest generation.
25  *
26  *       - generation 0, step 0 (G0S0) is the allocation area.  It is given
27  *         a fixed set of blocks during initialisation, and these blocks
28  *         are never freed.
29  *
30  *       - during garbage collection, each step which is an evacuation
31  *         destination (i.e. all steps except G0S0) is allocated a to-space.
32  *         evacuated objects are allocated into the step's to-space until
33  *         GC is finished, when the original step's contents may be freed
34  *         and replaced by the to-space.
35  *
36  *       - the mutable-list is per-generation (not per-step).  G0 doesn't 
37  *         have one (since every garbage collection collects at least G0).
38  * 
39  *       - block descriptors contain pointers to both the step and the
40  *         generation that the block belongs to, for convenience.
41  *
42  *       - static objects are stored in per-generation lists.  See GC.c for
43  *         details of how we collect CAFs in the generational scheme.
44  *
45  *       - large objects are per-step, and are promoted in the same way
46  *         as small objects, except that we may allocate large objects into
47  *         generation 1 initially.
48  */
49
50 typedef struct _step {
51   unsigned int no;              /* step number */
52   bdescr *blocks;               /* blocks in this step */
53   unsigned int n_blocks;        /* number of blocks */
54   struct _step *to;             /* where collected objects from this step go */
55   struct _generation *gen;      /* generation this step belongs to */
56   unsigned int gen_no;          /* generation number (cached) */
57   bdescr *large_objects;        /* large objects (doubly linked) */
58   int is_compacted;             /* compact this step */
59
60   /* temporary use during GC: */
61   StgPtr  hp;                   /* next free locn in to-space */
62   StgPtr  hpLim;                /* end of current to-space block */
63   bdescr *hp_bd;                /* bdescr of current to-space block */
64   bdescr *to_blocks;            /* bdescr of first to-space block */
65   unsigned int n_to_blocks;     /* number of blocks in to-space */
66   bdescr *scan_bd;              /* block currently being scanned */
67   StgPtr  scan;                 /* scan pointer in current block */
68   bdescr *new_large_objects;    /* large objects collected so far */
69   bdescr *scavenged_large_objects; /* live large objects after GC (dbl link) */
70   bdescr *bitmap;               /* bitmap for compacting collection */
71 } step;
72
73 typedef struct _generation {
74   unsigned int no;              /* generation number */
75   step *steps;                  /* steps */
76   unsigned int n_steps;         /* number of steps */
77   unsigned int max_blocks;      /* max blocks in step 0 */
78   StgMutClosure *mut_list;      /* mutable objects in this generation (not G0)*/
79   StgMutClosure *mut_once_list; /* objects that point to younger generations */
80
81   /* temporary use during GC: */
82   StgMutClosure *saved_mut_list;
83
84   /* stats information */
85   unsigned int collections;
86   unsigned int failed_promotions;
87 } generation;
88
89 /* -----------------------------------------------------------------------------
90    Allocation area for compiled code
91
92    OpenNursery(hp,hplim)        Opens the allocation area, and sets hp
93                                 and hplim appropriately.
94
95    CloseNursery(hp)             Closes the allocation area.
96
97    PleaseStopAllocating(void)   Arranges that the next call to
98                                 ExtendNursery() will fail, triggering
99                                 a return to the scheduler.  This is
100                                 useful for asynchronous interupts etc.
101    -------------------------------------------------------------------------- */
102
103 #define OpenNursery(hp,hplim)                           \
104   (hp    = CurrentNursery->free-1,                      \
105    hplim = CurrentNursery->start + BLOCK_SIZE_W - 1)
106   
107 #define CloseNursery(hp)  (CurrentNursery->free = (P_)(hp)+1)
108
109 /* -----------------------------------------------------------------------------
110    Prototype for an evacuate-like function
111    -------------------------------------------------------------------------- */
112
113 typedef void (*evac_fn)(StgClosure **);
114
115 /* -----------------------------------------------------------------------------
116    Trigger a GC from Haskell land.
117    -------------------------------------------------------------------------- */
118
119 extern void performGC(void);
120 extern void performMajorGC(void);
121 extern void performGCWithRoots(void (*get_roots)(evac_fn));
122
123 #endif /* STGSTORAGE_H */