X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FClosures.h;h=3df208cd09f2f25ee90df5605ae14f010f9818a8;hb=5c67b7e313b2455ca65d5aa5970d86889145e97e;hp=7cb4a528f2c40f276bc067fe950dc9e3d63d4c8b;hpb=e7c3f957fd36fd9f6369183b7a31e2a4a4c21b43;p=ghc-hetmet.git diff --git a/ghc/includes/Closures.h b/ghc/includes/Closures.h index 7cb4a52..3df208c 100644 --- a/ghc/includes/Closures.h +++ b/ghc/includes/Closures.h @@ -21,8 +21,8 @@ typedef struct { CostCentreStack *ccs; union { - struct _RetainerSet *rs; // Retainer Set - StgWord ldvw; // Lag/Drag/Void Word + struct _RetainerSet *rs; /* Retainer Set */ + StgWord ldvw; /* Lag/Drag/Void Word */ } hp; } StgProfHeader; @@ -35,6 +35,23 @@ typedef struct { } StgGranHeader; /* ----------------------------------------------------------------------------- + The SMP header + + 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. + + Note: we leave this padding word in all ways, rather than just SMP, + so that we don't have to recompile all our libraries for SMP. + -------------------------------------------------------------------------- */ + +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 +59,28 @@ 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; +typedef struct { + const struct _StgInfoTable* info; +#ifdef PROFILING + StgProfHeader prof; +#endif +#ifdef GRAN + StgGranHeader gran; +#endif + StgSMPThunkHeader smp; +} StgThunkHeader; + +#define THUNK_EXTRA_HEADER_W (sizeofW(StgThunkHeader)-sizeofW(StgHeader)) + /* ----------------------------------------------------------------------------- Closure Types @@ -67,7 +97,12 @@ struct StgClosure_ { }; typedef struct { - StgHeader header; + StgThunkHeader header; + struct StgClosure_ *payload[FLEXIBLE_ARRAY]; +} StgThunk; + +typedef struct { + StgThunkHeader header; StgClosure *selectee; } StgSelector; @@ -79,14 +114,19 @@ 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; - StgWord size; // number of words in payload + StgThunkHeader header; + StgWord size; /* number of words in payload */ StgClosure *fun; - StgClosure *payload[FLEXIBLE_ARRAY]; // contains a chunk of *stack* + StgClosure *payload[FLEXIBLE_ARRAY]; /* contains a chunk of *stack* */ } StgAP_STACK; typedef struct { @@ -148,11 +188,6 @@ typedef struct { StgHeader header; } StgRetry; -typedef struct _StgForeignObj { - StgHeader header; - StgAddr data; /* pointer to data in non-haskell-land */ -} StgForeignObj; - typedef struct _StgStableName { StgHeader header; StgWord sn; @@ -194,13 +229,13 @@ typedef struct _StgDeadWeak { /* Weak v */ typedef struct { StgHeader header; - StgArrWords *instrs; // a pointer to an ArrWords - StgArrWords *literals; // a pointer to an ArrWords - StgMutArrPtrs *ptrs; // a pointer to a MutArrPtrs - StgArrWords *itbls; // a pointer to an ArrWords - StgHalfWord arity; // arity of this BCO - StgHalfWord size; // size of this BCO (in words) - StgWord bitmap[FLEXIBLE_ARRAY]; // an StgLargeBitmap + StgArrWords *instrs; /* a pointer to an ArrWords */ + StgArrWords *literals; /* a pointer to an ArrWords */ + StgMutArrPtrs *ptrs; /* a pointer to a MutArrPtrs */ + StgArrWords *itbls; /* a pointer to an ArrWords */ + StgHalfWord arity; /* arity of this BCO */ + StgHalfWord size; /* size of this BCO (in words) */ + StgWord bitmap[FLEXIBLE_ARRAY]; /* an StgLargeBitmap */ } StgBCO; #define BCO_BITMAP(bco) ((StgLargeBitmap *)((StgBCO *)(bco))->bitmap) @@ -286,6 +321,7 @@ typedef struct { StgClosure* value; } StgMVar; + /* STM data structures * * StgTVar defines the only type that can be updated through the STM @@ -302,6 +338,11 @@ typedef struct { * - In StgTRecHeader, it might be worthwhile having separate chunks * of read-only and read-write locations. This would save a * new_value field in the read-only locations. + * + * - In StgAtomicallyFrame, we could combine the waiting bit into + * the header (maybe a different info tbl for a waiting transaction). + * This means we can specialise the code for the atomically frame + * (it immediately switches on frame->waiting anyway). */ typedef struct StgTVarWaitQueue_ { @@ -313,19 +354,25 @@ typedef struct StgTVarWaitQueue_ { typedef struct { StgHeader header; - StgClosure *current_value; - StgTVarWaitQueue *first_wait_queue_entry; + StgClosure *volatile current_value; + StgTVarWaitQueue *volatile first_wait_queue_entry; +#if defined(THREADED_RTS) + StgInt volatile num_updates; +#endif } StgTVar; -// new_value == expected_value for read-only accesses -// new_value is a StgTVarWaitQueue entry when trec in state TREC_WAITING +/* new_value == expected_value for read-only accesses */ +/* new_value is a StgTVarWaitQueue entry when trec in state TREC_WAITING */ typedef struct { StgTVar *tvar; StgClosure *expected_value; StgClosure *new_value; +#if defined(THREADED_RTS) + StgInt num_updates; +#endif } TRecEntry; -#define TREC_CHUNK_NUM_ENTRIES 256 +#define TREC_CHUNK_NUM_ENTRIES 16 typedef struct StgTRecChunk_ { StgHeader header; @@ -335,12 +382,11 @@ typedef struct StgTRecChunk_ { } StgTRecChunk; typedef enum { - TREC_ACTIVE, // Transaction in progress, outcome undecided - TREC_CANNOT_COMMIT, // Transaction in progress, inconsistent writes performed - TREC_MUST_ABORT, // Transaction in progress, inconsistent / out of date reads - TREC_COMMITTED, // Transaction has committed, now updating tvars - TREC_ABORTED, // Transaction has aborted, now reverting tvars - TREC_WAITING, // Transaction currently waiting + TREC_ACTIVE, /* Transaction in progress, outcome undecided */ + TREC_CONDEMNED, /* Transaction in progress, inconsistent / out of date reads */ + TREC_COMMITTED, /* Transaction has committed, now updating tvars */ + TREC_ABORTED, /* Transaction has aborted, now reverting tvars */ + TREC_WAITING, /* Transaction currently waiting */ } TRecState; typedef struct StgTRecHeader_ { @@ -352,7 +398,6 @@ typedef struct StgTRecHeader_ { typedef struct { StgHeader header; - StgBool waiting; StgClosure *code; } StgAtomicallyFrame; @@ -403,13 +448,6 @@ typedef struct StgRBH_ { struct StgBlockingQueueElement_ *blocking_queue; /* start of the BQ */ } StgRBH; -#else - -typedef struct StgBlockingQueue_ { - StgHeader header; - struct StgTSO_ *blocking_queue; -} StgBlockingQueue; - #endif #if defined(PAR)