[project @ 2005-05-19 13:21:55 by simonmar]
[ghc-hetmet.git] / ghc / includes / Closures.h
index 7cb4a52..39af80e 100644 (file)
@@ -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,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,14 +115,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 {
@@ -194,13 +235,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)
@@ -317,8 +358,8 @@ typedef struct {
   StgTVarWaitQueue          *first_wait_queue_entry;
 } 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;
@@ -335,12 +376,12 @@ 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_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 */
 } TRecState;
 
 typedef struct StgTRecHeader_ {
@@ -403,13 +444,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)