1 /* ----------------------------------------------------------------------------
2 * $Id: Closures.h,v 1.16 2000/01/18 12:36:38 simonmar Exp $
4 * (c) The GHC Team, 1998-1999
8 * -------------------------------------------------------------------------- */
14 * The Layout of a closure header depends on which kind of system we're
15 * compiling for: profiling, parallel, ticky, etc.
18 /* -----------------------------------------------------------------------------
20 -------------------------------------------------------------------------- */
28 #else /* !PROFILING */
34 #endif /* PROFILING */
36 /* -----------------------------------------------------------------------------
38 -------------------------------------------------------------------------- */
43 /* StgWord ga; */ /* nope! global addresses are managed via a hash table */
54 /* -----------------------------------------------------------------------------
56 -------------------------------------------------------------------------- */
61 StgWord procs; /* bitmask indicating on which PEs this closure resides */
72 /* -----------------------------------------------------------------------------
73 The ticky-ticky header
75 Comment from old Ticky.h:
77 This is used to record if a closure has been updated but not yet
78 entered. It is set when the closure is updated and cleared when
81 NB: It is {\em not} an ``entry count'', it is an
82 ``entries-after-update count.''
84 The commoning up of @CONST@, @CHARLIKE@ and @INTLIKE@ closures is
85 turned off(?) if this is required. This has only been done for 2s
86 collection. It is done using a nasty hack which defines the
87 @_Evacuate@ and @_Scavenge@ code for @CONST@, @CHARLIKE@ and @INTLIKE@
88 info tables to be @_Evacuate_1@ and @_Scavenge_1_0@.
89 -------------------------------------------------------------------------- */
94 /* old: W_ updated; */
97 #else /* !TICKY_TICKY */
103 #endif /* TICKY_TICKY */
105 /* -----------------------------------------------------------------------------
106 The full fixed-size closure header
108 The size of the fixed header is the sum of the optional parts plus a single
109 word for the entry code pointer.
110 -------------------------------------------------------------------------- */
113 const struct _StgInfoTable* info;
124 StgTickyHeader ticky;
128 #define FIXED_HS (sizeof(StgHeader))
130 /* -----------------------------------------------------------------------------
133 For any given closure type (defined in InfoTables.h), there is a
134 corresponding structure defined below. The name of the structure
135 is obtained by concatenating the closure type with '_closure'
136 -------------------------------------------------------------------------- */
138 /* All closures follow the generic format */
140 typedef struct StgClosure_ {
142 struct StgClosure_ *payload[0];
145 /* What a stroke of luck - all our mutable closures follow the same
146 * basic layout, with the mutable link field as the second field after
147 * the header. This means the following structure is the supertype of
151 typedef struct StgMutClosure_ {
154 struct StgMutClosure_ *mut_link;
155 struct StgClosure_ *payload[0];
160 StgClosure *selectee;
188 StgClosure *indirectee;
193 StgClosure *indirectee;
194 StgMutClosure *mut_link;
199 StgClosure *indirectee;
200 StgClosure *static_link;
203 typedef struct StgCAF_ {
206 StgMutClosure *mut_link;
208 struct StgCAF_ *link;
220 StgMutClosure *mut_link; /* mutable list */
221 StgClosure *payload[0];
227 StgMutClosure *mut_link;
230 typedef struct _StgUpdateFrame {
232 struct _StgUpdateFrame *link;
238 struct _StgUpdateFrame *link;
243 struct _StgUpdateFrame *link;
244 StgInt exceptions_blocked;
260 } StgIntCharlikeClosure;
262 /* statically allocated */
267 typedef struct _StgForeignObj {
269 StgAddr data; /* pointer to data in non-haskell-land */
272 typedef struct _StgStableName {
277 typedef struct _StgWeak { /* Weak v */
280 StgClosure *value; /* v */
281 StgClosure *finalizer;
282 struct _StgWeak *link;
285 typedef struct _StgDeadWeak { /* Weak v */
287 struct _StgWeak *link;
290 /* Dynamic stack frames - these have a liveness mask in the object
291 * itself, rather than in the info table. Useful for generic heap
296 const struct _StgInfoTable* info;
302 /* Concurrent communication objects */
306 struct StgTSO_ *head;
307 StgMutClosure *mut_link;
308 struct StgTSO_ *tail;
312 #if defined(PAR) || defined(GRAN)
314 StgBlockingQueueElement represents the types of closures that can be
315 found on a blocking queue: StgTSO, StgRBHSave, StgBlockedFetch.
316 (StgRBHSave can only appear at the end of a blocking queue).
317 Logically, this is a union type, but defining another struct with a common
318 layout is easier to handle in the code (same as for StgMutClosures).
320 typedef struct StgBlockingQueueElement_ {
322 struct StgBlockingQueueElement_ *link;
323 StgMutClosure *mut_link;
324 struct StgClosure_ *payload[0];
325 } StgBlockingQueueElement;
327 typedef struct StgBlockingQueue_ {
329 struct StgBlockingQueueElement_ *blocking_queue;
330 StgMutClosure *mut_link;
333 /* this closure is hanging at the end of a blocking queue in (par setup only) */
334 typedef struct StgRBHSave_ {
339 typedef struct StgRBH_ {
341 struct StgBlockingQueueElement_ *blocking_queue;
342 StgMutClosure *mut_link;
347 typedef struct StgBlockingQueue_ {
349 struct StgTSO_ *blocking_queue;
350 StgMutClosure *mut_link;
356 /* global indirections aka FETCH_ME closures */
357 typedef struct StgFetchMe_ {
359 globalAddr *ga; /* type globalAddr is abstract here */
360 StgMutClosure *mut_link;
363 /* same contents as an ordinary StgBlockingQueue */
364 typedef struct StgFetchMeBlockingQueue_ {
366 struct StgBlockingQueueElement_ *blocking_queue;
367 StgMutClosure *mut_link;
368 } StgFetchMeBlockingQueue;
370 /* entry in a blocking queue, indicating a request from a TSO on another PE */
371 typedef struct StgBlockedFetch_ {
373 struct StgBlockingQueueElement_ *link;
374 StgMutClosure *mut_link;
380 #endif /* CLOSURES_H */