X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FClosures.h;h=8487893b330ad687a273a3151e1d46fc4eb3687e;hb=bfd03f0e261b7cb73eef653b36a8051066e496d5;hp=39af80e795811784f5454ac32198b8bdb05369cb;hpb=0f3205e6c40575910d50bc2cc42020ccf55e07ba;p=ghc-hetmet.git diff --git a/ghc/includes/Closures.h b/ghc/includes/Closures.h index 39af80e..8487893 100644 --- a/ghc/includes/Closures.h +++ b/ghc/includes/Closures.h @@ -189,11 +189,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; @@ -327,6 +322,7 @@ typedef struct { StgClosure* value; } StgMVar; + /* STM data structures * * StgTVar defines the only type that can be updated through the STM @@ -343,6 +339,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_ { @@ -354,8 +355,11 @@ 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(SMP) + StgInt volatile num_updates; +#endif } StgTVar; /* new_value == expected_value for read-only accesses */ @@ -364,9 +368,12 @@ typedef struct { StgTVar *tvar; StgClosure *expected_value; StgClosure *new_value; +#if defined(SMP) + StgInt num_updates; +#endif } TRecEntry; -#define TREC_CHUNK_NUM_ENTRIES 256 +#define TREC_CHUNK_NUM_ENTRIES 16 typedef struct StgTRecChunk_ { StgHeader header; @@ -377,8 +384,7 @@ typedef struct 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_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 */ @@ -393,7 +399,6 @@ typedef struct StgTRecHeader_ { typedef struct { StgHeader header; - StgBool waiting; StgClosure *code; } StgAtomicallyFrame;