X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FClosures.h;h=3df208cd09f2f25ee90df5605ae14f010f9818a8;hb=e6218fe7eff4e34e1a3c823cd4b7aebe09d2d4fb;hp=f9bfeb4dc1ff0361dfb890c911cf24997da7f2b0;hpb=e792bb8488aa3c33d7b186abdf53aa8b0ef68b11;p=ghc-hetmet.git diff --git a/ghc/includes/Closures.h b/ghc/includes/Closures.h index f9bfeb4..3df208c 100644 --- a/ghc/includes/Closures.h +++ b/ghc/includes/Closures.h @@ -36,9 +36,15 @@ typedef struct { /* ----------------------------------------------------------------------------- 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). + + 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 { @@ -62,13 +68,6 @@ typedef struct { #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 @@ -77,11 +76,11 @@ typedef struct { #ifdef GRAN StgGranHeader gran; #endif -#ifdef SMP StgSMPThunkHeader smp; -#endif } StgThunkHeader; +#define THUNK_EXTRA_HEADER_W (sizeofW(StgThunkHeader)-sizeofW(StgHeader)) + /* ----------------------------------------------------------------------------- Closure Types @@ -339,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_ { @@ -352,8 +356,8 @@ typedef struct { StgHeader header; StgClosure *volatile current_value; StgTVarWaitQueue *volatile first_wait_queue_entry; -#if defined(SMP) - struct StgTRecHeader_ *volatile last_update_by; +#if defined(THREADED_RTS) + StgInt volatile num_updates; #endif } StgTVar; @@ -363,12 +367,12 @@ typedef struct { StgTVar *tvar; StgClosure *expected_value; StgClosure *new_value; -#if defined(SMP) - struct StgTRecHeader_ *saw_update_by; +#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; @@ -394,7 +398,6 @@ typedef struct StgTRecHeader_ { typedef struct { StgHeader header; - StgBool waiting; StgClosure *code; } StgAtomicallyFrame;