X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=includes%2FClosures.h;h=64582ba6b5bd66b772589951f72f993ff7c9bec3;hb=87c93cf56c83abf0148c91d5972dbe65dc72c38a;hp=3df208cd09f2f25ee90df5605ae14f010f9818a8;hpb=0065d5ab628975892cea1ec7303f968c3338cbe1;p=ghc-hetmet.git diff --git a/includes/Closures.h b/includes/Closures.h index 3df208c..64582ba 100644 --- a/includes/Closures.h +++ b/includes/Closures.h @@ -232,7 +232,6 @@ typedef struct { 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 */ @@ -331,7 +330,7 @@ typedef struct { * space for these data structures at the cost of more complexity in the * implementation: * - * - In StgTVar, current_value and first_wait_queue_entry could be held in + * - In StgTVar, current_value and first_watch_queue_entry could be held in * the same field: if any thread is waiting then its expected_value for * the tvar is the current value. * @@ -345,24 +344,33 @@ typedef struct { * (it immediately switches on frame->waiting anyway). */ -typedef struct StgTVarWaitQueue_ { +typedef struct StgTRecHeader_ StgTRecHeader; + +typedef struct StgTVarWatchQueue_ { StgHeader header; - struct StgTSO_ *waiting_tso; - struct StgTVarWaitQueue_ *next_queue_entry; - struct StgTVarWaitQueue_ *prev_queue_entry; -} StgTVarWaitQueue; + StgClosure *closure; // StgTSO or StgAtomicInvariant + struct StgTVarWatchQueue_ *next_queue_entry; + struct StgTVarWatchQueue_ *prev_queue_entry; +} StgTVarWatchQueue; typedef struct { StgHeader header; StgClosure *volatile current_value; - StgTVarWaitQueue *volatile first_wait_queue_entry; + StgTVarWatchQueue *volatile first_watch_queue_entry; #if defined(THREADED_RTS) StgInt volatile num_updates; #endif } StgTVar; +typedef struct { + StgHeader header; + StgClosure *code; + StgTRecHeader *last_execution; + StgWord lock; +} StgAtomicInvariant; + /* new_value == expected_value for read-only accesses */ -/* new_value is a StgTVarWaitQueue entry when trec in state TREC_WAITING */ +/* new_value is a StgTVarWatchQueue entry when trec in state TREC_WAITING */ typedef struct { StgTVar *tvar; StgClosure *expected_value; @@ -389,29 +397,38 @@ typedef enum { TREC_WAITING, /* Transaction currently waiting */ } TRecState; -typedef struct StgTRecHeader_ { +typedef struct StgInvariantCheckQueue_ { + StgHeader header; + StgAtomicInvariant *invariant; + StgTRecHeader *my_execution; + struct StgInvariantCheckQueue_ *next_queue_entry; +} StgInvariantCheckQueue; + +struct StgTRecHeader_ { StgHeader header; TRecState state; struct StgTRecHeader_ *enclosing_trec; StgTRecChunk *current_chunk; -} StgTRecHeader; + StgInvariantCheckQueue *invariants_to_check; +}; typedef struct { - StgHeader header; - StgClosure *code; + StgHeader header; + StgClosure *code; + StgTVarWatchQueue *next_invariant_to_check; } StgAtomicallyFrame; typedef struct { - StgHeader header; - StgClosure *handler; + StgHeader header; + StgClosure *code; + StgClosure *handler; } StgCatchSTMFrame; typedef struct { - StgHeader header; - StgBool running_alt_code; - StgClosure *first_code; - StgClosure *alt_code; - StgTRecHeader *first_code_trec; + StgHeader header; + StgBool running_alt_code; + StgClosure *first_code; + StgClosure *alt_code; } StgCatchRetryFrame; #if defined(PAR) || defined(GRAN)