X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=ghc%2Fincludes%2FClosures.h;fp=ghc%2Fincludes%2FClosures.h;h=39af80e795811784f5454ac32198b8bdb05369cb;hb=0f3205e6c40575910d50bc2cc42020ccf55e07ba;hp=066fe91d3e6a7486811eb08125774fc6dd2b7c4c;hpb=b43be28258a3d49bde40095b210047e99742f8a5;p=ghc-hetmet.git diff --git a/ghc/includes/Closures.h b/ghc/includes/Closures.h index 066fe91..39af80e 100644 --- a/ghc/includes/Closures.h +++ b/ghc/includes/Closures.h @@ -35,6 +35,17 @@ typedef struct { } StgGranHeader; /* ----------------------------------------------------------------------------- + The SMP header + + In SMP mode, we have an extra word of padding in a thunk's header. + (Note: thunks only; other closures do not have this padding word). + -------------------------------------------------------------------------- */ + +typedef struct { + StgWord pad; +} StgSMPThunkHeader; + +/* ----------------------------------------------------------------------------- The full fixed-size closure header The size of the fixed header is the sum of the optional parts plus a single @@ -42,15 +53,35 @@ typedef struct { -------------------------------------------------------------------------- */ typedef struct { - const struct _StgInfoTable* info; + const struct _StgInfoTable* info; #ifdef PROFILING - StgProfHeader prof; + StgProfHeader prof; #endif #ifdef GRAN - StgGranHeader gran; + StgGranHeader gran; #endif } StgHeader; +/* + * In SMP mode, a thunk has a padding word to take the updated value. + * This is so that the update doesn't overwrite the payload, so we can + * avoid needing to lock the thunk during entry and update. + * + * Note: this doesn't apply to THUNK_STATICs, which have no payload. + */ +typedef struct { + const struct _StgInfoTable* info; +#ifdef PROFILING + StgProfHeader prof; +#endif +#ifdef GRAN + StgGranHeader gran; +#endif +#ifdef SMP + StgSMPThunkHeader smp; +#endif +} StgThunkHeader; + /* ----------------------------------------------------------------------------- Closure Types @@ -67,7 +98,12 @@ struct StgClosure_ { }; typedef struct { - StgHeader header; + StgThunkHeader header; + struct StgClosure_ *payload[FLEXIBLE_ARRAY]; +} StgThunk; + +typedef struct { + StgThunkHeader header; StgClosure *selectee; } StgSelector; @@ -79,11 +115,16 @@ typedef struct { StgClosure *payload[FLEXIBLE_ARRAY]; } StgPAP; -/* AP closures have the same layout, for convenience */ -typedef StgPAP StgAP; +typedef struct { + StgThunkHeader header; + StgHalfWord arity; /* zero if it is an AP */ + StgHalfWord n_args; + StgClosure *fun; /* really points to a fun */ + StgClosure *payload[FLEXIBLE_ARRAY]; +} StgAP; typedef struct { - StgHeader header; + StgThunkHeader header; StgWord size; /* number of words in payload */ StgClosure *fun; StgClosure *payload[FLEXIBLE_ARRAY]; /* contains a chunk of *stack* */