Fix Haddock errors.
[ghc-hetmet.git] / includes / Closures.h
1 /* ----------------------------------------------------------------------------
2  *
3  * (c) The GHC Team, 1998-2004
4  *
5  * Closures
6  *
7  * -------------------------------------------------------------------------- */
8
9 #ifndef CLOSURES_H
10 #define CLOSURES_H
11
12 /*
13  * The Layout of a closure header depends on which kind of system we're
14  * compiling for: profiling, parallel, ticky, etc.
15  */
16
17 /* -----------------------------------------------------------------------------
18    The profiling header
19    -------------------------------------------------------------------------- */
20
21 typedef struct {
22   CostCentreStack *ccs;
23   union {
24     struct _RetainerSet *rs;  /* Retainer Set */
25     StgWord ldvw;             /* Lag/Drag/Void Word */
26   } hp;
27 } StgProfHeader;
28
29 /* -----------------------------------------------------------------------------
30    The GranSim header
31    -------------------------------------------------------------------------- */
32
33 typedef struct {
34   StgWord procs; /* bitmask indicating on which PEs this closure resides */
35 } StgGranHeader;
36
37 /* -----------------------------------------------------------------------------
38    The SMP header
39    
40    A thunk has a padding word to take the updated value.  This is so
41    that the update doesn't overwrite the payload, so we can avoid
42    needing to lock the thunk during entry and update.
43    
44    Note: this doesn't apply to THUNK_STATICs, which have no payload.
45
46    Note: we leave this padding word in all ways, rather than just SMP,
47    so that we don't have to recompile all our libraries for SMP.
48    -------------------------------------------------------------------------- */
49
50 typedef struct {
51     StgWord pad;
52 } StgSMPThunkHeader;
53
54 /* -----------------------------------------------------------------------------
55    The full fixed-size closure header
56
57    The size of the fixed header is the sum of the optional parts plus a single
58    word for the entry code pointer.
59    -------------------------------------------------------------------------- */
60
61 typedef struct {
62     const struct _StgInfoTable* info;
63 #ifdef PROFILING
64     StgProfHeader         prof;
65 #endif
66 #ifdef GRAN
67     StgGranHeader         gran;
68 #endif
69 } StgHeader;
70
71 typedef struct {
72     const struct _StgInfoTable* info;
73 #ifdef PROFILING
74     StgProfHeader         prof;
75 #endif
76 #ifdef GRAN
77     StgGranHeader         gran;
78 #endif
79     StgSMPThunkHeader     smp;
80 } StgThunkHeader;
81
82 #define THUNK_EXTRA_HEADER_W (sizeofW(StgThunkHeader)-sizeofW(StgHeader))
83
84 /* -----------------------------------------------------------------------------
85    Closure Types
86
87    For any given closure type (defined in InfoTables.h), there is a
88    corresponding structure defined below.  The name of the structure
89    is obtained by concatenating the closure type with '_closure'
90    -------------------------------------------------------------------------- */
91
92 /* All closures follow the generic format */
93
94 struct StgClosure_ {
95     StgHeader   header;
96     struct StgClosure_ *payload[FLEXIBLE_ARRAY];
97 };
98
99 typedef struct {
100     StgThunkHeader  header;
101     struct StgClosure_ *payload[FLEXIBLE_ARRAY];
102 } StgThunk;
103
104 typedef struct {
105     StgThunkHeader   header;
106     StgClosure *selectee;
107 } StgSelector;
108
109 typedef struct {
110     StgHeader   header;
111     StgHalfWord arity;          /* zero if it is an AP */
112     StgHalfWord n_args;
113     StgClosure *fun;            /* really points to a fun */
114     StgClosure *payload[FLEXIBLE_ARRAY];
115 } StgPAP;
116
117 typedef struct {
118     StgThunkHeader   header;
119     StgHalfWord arity;          /* zero if it is an AP */
120     StgHalfWord n_args;
121     StgClosure *fun;            /* really points to a fun */
122     StgClosure *payload[FLEXIBLE_ARRAY];
123 } StgAP;
124
125 typedef struct {
126     StgThunkHeader   header;
127     StgWord     size;                    /* number of words in payload */
128     StgClosure *fun;
129     StgClosure *payload[FLEXIBLE_ARRAY]; /* contains a chunk of *stack* */
130 } StgAP_STACK;
131
132 typedef struct {
133     StgHeader   header;
134     StgClosure *indirectee;
135 } StgInd;
136
137 typedef struct {
138     StgHeader     header;
139     StgClosure   *indirectee;
140     StgClosure   *static_link;
141     struct _StgInfoTable *saved_info;
142 } StgIndStatic;
143
144 typedef struct {
145     StgHeader  header;
146     StgWord    words;
147     StgWord    payload[FLEXIBLE_ARRAY];
148 } StgArrWords;
149
150 typedef struct {
151     StgHeader   header;
152     StgWord     ptrs;
153     StgClosure *payload[FLEXIBLE_ARRAY];
154 } StgMutArrPtrs;
155
156 typedef struct {
157     StgHeader   header;
158     StgClosure *var;
159 } StgMutVar;
160
161 typedef struct _StgUpdateFrame {
162     StgHeader  header;
163     StgClosure *updatee;
164 } StgUpdateFrame;
165
166 typedef struct {
167     StgHeader  header;
168     StgInt      exceptions_blocked;
169     StgClosure *handler;
170 } StgCatchFrame;
171
172 typedef struct {
173     StgHeader  header;
174 } StgStopFrame;  
175
176 typedef struct {
177   StgHeader header;
178   StgWord data;
179 } StgIntCharlikeClosure;
180
181 /* statically allocated */
182 typedef struct {
183   StgHeader  header;
184 } StgRetry;
185
186 typedef struct _StgStableName {
187   StgHeader      header;
188   StgWord        sn;
189 } StgStableName;
190
191 typedef struct _StgWeak {       /* Weak v */
192   StgHeader header;
193   StgClosure *key;
194   StgClosure *value;            /* v */
195   StgClosure *finalizer;
196   struct _StgWeak *link;
197 } StgWeak;
198
199 typedef struct _StgDeadWeak {   /* Weak v */
200   StgHeader header;
201   struct _StgWeak *link;
202 } StgDeadWeak;
203
204 /* Byte code objects.  These are fixed size objects with pointers to
205  * four arrays, designed so that a BCO can be easily "re-linked" to
206  * other BCOs, to facilitate GHC's intelligent recompilation.  The
207  * array of instructions is static and not re-generated when the BCO
208  * is re-linked, but the other 3 arrays will be regenerated.
209  *
210  * A BCO represents either a function or a stack frame.  In each case,
211  * it needs a bitmap to describe to the garbage collector the
212  * pointerhood of its arguments/free variables respectively, and in
213  * the case of a function it also needs an arity.  These are stored
214  * directly in the BCO, rather than in the instrs array, for two
215  * reasons:
216  * (a) speed: we need to get at the bitmap info quickly when
217  *     the GC is examining APs and PAPs that point to this BCO
218  * (b) a subtle interaction with the compacting GC.  In compacting
219  *     GC, the info that describes the size/layout of a closure
220  *     cannot be in an object more than one level of indirection
221  *     away from the current object, because of the order in
222  *     which pointers are updated to point to their new locations.
223  */
224
225 typedef struct {
226     StgHeader      header;
227     StgArrWords   *instrs;      /* a pointer to an ArrWords */
228     StgArrWords   *literals;    /* a pointer to an ArrWords */
229     StgMutArrPtrs *ptrs;        /* a pointer to a  MutArrPtrs */
230     StgHalfWord   arity;        /* arity of this BCO */
231     StgHalfWord   size;         /* size of this BCO (in words) */
232     StgWord       bitmap[FLEXIBLE_ARRAY];  /* an StgLargeBitmap */
233 } StgBCO;
234
235 #define BCO_BITMAP(bco)      ((StgLargeBitmap *)((StgBCO *)(bco))->bitmap)
236 #define BCO_BITMAP_SIZE(bco) (BCO_BITMAP(bco)->size)
237 #define BCO_BITMAP_BITS(bco) (BCO_BITMAP(bco)->bitmap)
238 #define BCO_BITMAP_SIZEW(bco) ((BCO_BITMAP_SIZE(bco) + BITS_IN(StgWord) - 1) \
239                                 / BITS_IN(StgWord))
240
241 /* -----------------------------------------------------------------------------
242    Dynamic stack frames for generic heap checks.
243
244    These generic heap checks are slow, but have the advantage of being
245    usable in a variety of situations.
246
247    The one restriction is that any relevant SRTs must already be pointed
248    to from the stack.  The return address doesn't need to have an info
249    table attached: hence it can be any old code pointer.
250
251    The liveness mask contains a 1 at bit n, if register Rn contains a
252    non-pointer.  The contents of all 8 vanilla registers are always saved
253    on the stack; the liveness mask tells the GC which ones contain
254    pointers.
255
256    Good places to use a generic heap check: 
257
258         - case alternatives (the return address with an SRT is already
259           on the stack).
260
261         - primitives (no SRT required).
262
263    The stack frame layout for a RET_DYN is like this:
264
265           some pointers         |-- RET_DYN_PTRS(liveness) words
266           some nonpointers      |-- RET_DYN_NONPTRS(liveness) words
267                                
268           L1                    \
269           D1-2                  |-- RET_DYN_NONPTR_REGS_SIZE words
270           F1-4                  /
271                                
272           R1-8                  |-- RET_DYN_BITMAP_SIZE words
273                                
274           return address        \
275           liveness mask         |-- StgRetDyn structure
276           stg_gen_chk_info      /
277
278    we assume that the size of a double is always 2 pointers (wasting a
279    word when it is only one pointer, but avoiding lots of #ifdefs).
280
281    See Liveness.h for the macros (RET_DYN_PTRS() etc.).
282
283    NOTE: if you change the layout of RET_DYN stack frames, then you
284    might also need to adjust the value of RESERVED_STACK_WORDS in
285    Constants.h.
286    -------------------------------------------------------------------------- */
287
288 typedef struct {
289     const struct _StgInfoTable* info;
290     StgWord        liveness;
291     StgWord        ret_addr;
292     StgClosure *   payload[FLEXIBLE_ARRAY];
293 } StgRetDyn;
294
295 /* A function return stack frame: used when saving the state for a
296  * garbage collection at a function entry point.  The function
297  * arguments are on the stack, and we also save the function (its
298  * info table describes the pointerhood of the arguments).
299  *
300  * The stack frame size is also cached in the frame for convenience.
301  */
302 typedef struct {
303     const struct _StgInfoTable* info;
304     StgWord        size;
305     StgClosure *   fun;
306     StgClosure *   payload[FLEXIBLE_ARRAY];
307 } StgRetFun;
308
309 /* Concurrent communication objects */
310
311 typedef struct {
312   StgHeader       header;
313   struct StgTSO_ *head;
314   struct StgTSO_ *tail;
315   StgClosure*     value;
316 } StgMVar;
317
318
319 /* STM data structures
320  *
321  *  StgTVar defines the only type that can be updated through the STM
322  *  interface.
323  * 
324  *  Note that various optimisations may be possible in order to use less
325  *  space for these data structures at the cost of more complexity in the
326  *  implementation:
327  *
328  *   - In StgTVar, current_value and first_watch_queue_entry could be held in
329  *     the same field: if any thread is waiting then its expected_value for
330  *     the tvar is the current value.  
331  *
332  *   - In StgTRecHeader, it might be worthwhile having separate chunks
333  *     of read-only and read-write locations.  This would save a
334  *     new_value field in the read-only locations.
335  *
336  *   - In StgAtomicallyFrame, we could combine the waiting bit into
337  *     the header (maybe a different info tbl for a waiting transaction).
338  *     This means we can specialise the code for the atomically frame
339  *     (it immediately switches on frame->waiting anyway).
340  */
341
342 typedef struct StgTRecHeader_ StgTRecHeader;
343
344 typedef struct StgTVarWatchQueue_ {
345   StgHeader                  header;
346   StgClosure                *closure; // StgTSO or StgAtomicInvariant
347   struct StgTVarWatchQueue_ *next_queue_entry;
348   struct StgTVarWatchQueue_ *prev_queue_entry;
349 } StgTVarWatchQueue;
350
351 typedef struct {
352   StgHeader                  header;
353   StgClosure                *volatile current_value;
354   StgTVarWatchQueue         *volatile first_watch_queue_entry;
355 #if defined(THREADED_RTS)
356   StgInt                     volatile num_updates;
357 #endif
358 } StgTVar;
359
360 typedef struct {
361   StgHeader      header;
362   StgClosure    *code;
363   StgTRecHeader *last_execution;
364   StgWord        lock;
365 } StgAtomicInvariant;
366
367 /* new_value == expected_value for read-only accesses */
368 /* new_value is a StgTVarWatchQueue entry when trec in state TREC_WAITING */
369 typedef struct {
370   StgTVar                   *tvar;
371   StgClosure                *expected_value;
372   StgClosure                *new_value; 
373 #if defined(THREADED_RTS)
374   StgInt                     num_updates;
375 #endif
376 } TRecEntry;
377
378 #define TREC_CHUNK_NUM_ENTRIES 16
379
380 typedef struct StgTRecChunk_ {
381   StgHeader                  header;
382   struct StgTRecChunk_      *prev_chunk;
383   StgWord                    next_entry_idx;
384   TRecEntry                  entries[TREC_CHUNK_NUM_ENTRIES];
385 } StgTRecChunk;
386
387 typedef enum { 
388   TREC_ACTIVE,        /* Transaction in progress, outcome undecided */
389   TREC_CONDEMNED,     /* Transaction in progress, inconsistent / out of date reads */
390   TREC_COMMITTED,     /* Transaction has committed, now updating tvars */
391   TREC_ABORTED,       /* Transaction has aborted, now reverting tvars */
392   TREC_WAITING,       /* Transaction currently waiting */
393 } TRecState;
394
395 typedef struct StgInvariantCheckQueue_ {
396   StgHeader                       header;
397   StgAtomicInvariant             *invariant;
398   StgTRecHeader                  *my_execution;
399   struct StgInvariantCheckQueue_ *next_queue_entry;
400 } StgInvariantCheckQueue;
401
402 struct StgTRecHeader_ {
403   StgHeader                  header;
404   TRecState                  state;
405   struct StgTRecHeader_     *enclosing_trec;
406   StgTRecChunk              *current_chunk;
407   StgInvariantCheckQueue    *invariants_to_check;
408 };
409
410 typedef struct {
411   StgHeader   header;
412   StgClosure *code;
413   StgTVarWatchQueue *next_invariant_to_check;
414 } StgAtomicallyFrame;
415
416 typedef struct {
417   StgHeader   header;
418   StgClosure *code;
419   StgClosure *handler;
420 } StgCatchSTMFrame;
421
422 typedef struct {
423   StgHeader      header;
424   StgBool        running_alt_code;
425   StgClosure    *first_code;
426   StgClosure    *alt_code;
427 } StgCatchRetryFrame;
428
429 #if defined(PAR) || defined(GRAN)
430 /*
431   StgBlockingQueueElement is a ``collective type'' representing the types
432   of closures that can be found on a blocking queue: StgTSO, StgRBHSave,
433   StgBlockedFetch.  (StgRBHSave can only appear at the end of a blocking
434   queue).  Logically, this is a union type, but defining another struct
435   with a common layout is easier to handle in the code.  
436   Note that in the standard setup only StgTSOs can be on a blocking queue.
437   This is one of the main reasons for slightly different code in files
438   such as Schedule.c.
439 */
440 typedef struct StgBlockingQueueElement_ {
441   StgHeader                         header;
442   struct StgBlockingQueueElement_  *link;      /* next elem in BQ */
443   struct StgClosure_               *payload[FLEXIBLE_ARRAY];/* contents of the closure */
444 } StgBlockingQueueElement;
445
446 /* only difference to std code is type of the elem in the BQ */
447 typedef struct StgBlockingQueue_ {
448   StgHeader                 header;
449   struct StgBlockingQueueElement_ *blocking_queue; /* start of the BQ */
450 } StgBlockingQueue;
451
452 /* this closure is hanging at the end of a blocking queue in (see RBH.c) */
453 typedef struct StgRBHSave_ {
454   StgHeader    header;
455   StgClosure  *payload[FLEXIBLE_ARRAY];     /* 2 words ripped out of the guts of the */
456 } StgRBHSave;                  /*  closure holding the blocking queue */
457  
458 typedef struct StgRBH_ {
459   StgHeader                         header;
460   struct StgBlockingQueueElement_  *blocking_queue; /* start of the BQ */
461 } StgRBH;
462
463 #endif
464
465 #if defined(PAR)
466 /* global indirections aka FETCH_ME closures */
467 typedef struct StgFetchMe_ {
468   StgHeader              header;
469   globalAddr            *ga;        /* ptr to unique id for a closure */
470 } StgFetchMe;
471
472 /* same contents as an ordinary StgBlockingQueue */
473 typedef struct StgFetchMeBlockingQueue_ {
474   StgHeader                          header;
475   struct StgBlockingQueueElement_   *blocking_queue; /* start of the BQ */
476 } StgFetchMeBlockingQueue;
477
478 /* This is an entry in a blocking queue. It indicates a fetch request from a 
479    TSO on another PE demanding the value of this closur. Note that a
480    StgBlockedFetch can only occur in a BQ. Once the node is evaluated and
481    updated with the result, the result will be sent back (the PE is encoded
482    in the globalAddr) and the StgBlockedFetch closure will be nuked.
483 */
484 typedef struct StgBlockedFetch_ {
485   StgHeader                         header;
486   struct StgBlockingQueueElement_  *link;     /* next elem in the BQ */
487   StgClosure                       *node;     /* node to fetch */
488   globalAddr                        ga;       /* where to send the result to */
489 } StgBlockedFetch;                            /* NB: not just a ptr to a GA */
490 #endif
491
492 #endif /* CLOSURES_H */