[project @ 2001-11-21 16:56:19 by sof]
[ghc-hetmet.git] / ghc / includes / Closures.h
index e2e2932..5f0b570 100644 (file)
@@ -1,5 +1,7 @@
 /* ----------------------------------------------------------------------------
- * $Id: Closures.h,v 1.5 1999/01/26 11:12:55 simonm Exp $
+ * $Id: Closures.h,v 1.28 2001/10/03 13:57:42 simonmar Exp $
+ *
+ * (c) The GHC Team, 1998-1999
  *
  * Closures
  *
    The profiling header
    -------------------------------------------------------------------------- */
 
-#ifdef PROFILING
-
 typedef struct {
    CostCentreStack *ccs;
 } StgProfHeader;
 
-#else /* !PROFILING */
-
-typedef struct {
-       /* empty */
-} StgProfHeader;
-
-#endif /* PROFILING */
-
 /* -----------------------------------------------------------------------------
    The parallel header
    -------------------------------------------------------------------------- */
 
-#ifdef GRAN
-
 typedef struct {
-  W_ procs;
-} StgGranHeader;
+  /* StgWord ga; */  /* nope! global addresses are managed via a hash table */
+} StgParHeader;
 
-#else /* !PAR */
+/* -----------------------------------------------------------------------------
+   The GranSim header
+   -------------------------------------------------------------------------- */
 
 typedef struct {
-  /* empty */
+  StgWord procs; /* bitmask indicating on which PEs this closure resides */
 } StgGranHeader;
 
-#endif /* PAR */
-
 /* -----------------------------------------------------------------------------
    The ticky-ticky header
 
@@ -68,20 +58,10 @@ typedef struct {
    info tables to be @_Evacuate_1@ and @_Scavenge_1_0@.
    -------------------------------------------------------------------------- */
 
-#ifdef TICKY
-
 typedef struct {
-  W_ updated;
+  /* old: W_ updated; */
 } StgTickyHeader;
 
-#else /* !TICKY */
-
-typedef struct {
-       /* empty */
-} StgTickyHeader;
-
-#endif /* TICKY */
-
 /* -----------------------------------------------------------------------------
    The full fixed-size closure header
 
@@ -91,9 +71,18 @@ typedef struct {
 
 typedef struct {
        const struct _StgInfoTable* info;
+#ifdef PROFILING
        StgProfHeader         prof;
-       StgGranHeader         par;
+#endif
+#ifdef PAR
+       StgParHeader          par;
+#endif
+#ifdef GRAN
+       StgGranHeader         gran;
+#endif
+#ifdef TICKY_TICKY
        StgTickyHeader        ticky;
+#endif
 } StgHeader;
 
 #define FIXED_HS (sizeof(StgHeader))
@@ -108,10 +97,10 @@ typedef struct {
 
 /* All closures follow the generic format */
 
-typedef struct StgClosure_ {
+struct StgClosure_ {
     StgHeader   header;
-    struct StgClosure_ *payload[0];
-} StgClosure;
+    struct StgClosure_ *payload[FLEXIBLE_ARRAY];
+};
 
 /* What a stroke of luck - all our mutable closures follow the same
  * basic layout, with the mutable link field as the second field after
@@ -121,9 +110,9 @@ typedef struct StgClosure_ {
 
 typedef struct StgMutClosure_ {
     StgHeader   header;
-    StgPtr     *padding;
+    StgWord     padding;
     struct StgMutClosure_ *mut_link;
-    struct StgClosure_ *payload[0];
+    struct StgClosure_ *payload[FLEXIBLE_ARRAY];
 } StgMutClosure;
 
 typedef struct {
@@ -135,25 +124,17 @@ typedef struct {
     StgHeader   header;
     StgWord     n_args;
     StgClosure *fun;
-    StgPtr      payload[0];
+    StgClosure *payload[FLEXIBLE_ARRAY];
 } StgPAP;
 
 typedef struct {
     StgHeader   header;
     StgWord     n_args;
     StgClosure *fun;
-    StgPtr      payload[0];
+    StgClosure *payload[FLEXIBLE_ARRAY];
 } StgAP_UPD;
 
 typedef struct {
-    StgHeader  header;
-    StgWord    n_ptrs;
-    StgWord    n_words;
-    StgWord    n_instrs;
-    StgPtr     payload[0];
-} StgBCO;
-
-typedef struct {
     StgHeader   header;
     StgClosure *indirectee;
 } StgInd;
@@ -165,35 +146,23 @@ typedef struct {
 } StgIndOldGen;
 
 typedef struct {
-    StgHeader   header;
-    StgClosure *indirectee;
-    StgClosure *static_link;
+    StgHeader     header;
+    StgClosure   *indirectee;
+    StgClosure   *static_link;
+    struct _StgInfoTable *saved_info;
 } StgIndStatic;
 
-typedef struct StgCAF_ {
-    StgHeader   header;
-    StgClosure *body;
-    StgClosure *value;
-    struct StgCAF_ *link;
-} StgCAF;
-
-typedef struct {
-    StgHeader  header;
-    struct StgTSO_ *blocking_queue;
-    StgMutClosure *mut_link;
-} StgBlockingQueue;
-
 typedef struct {
     StgHeader  header;
     StgWord    words;
-    StgWord    payload[0];
+    StgWord    payload[FLEXIBLE_ARRAY];
 } StgArrWords;
 
 typedef struct {
     StgHeader   header;
     StgWord     ptrs;
     StgMutClosure *mut_link;   /* mutable list */
-    StgClosure *payload[0];
+    StgClosure *payload[FLEXIBLE_ARRAY];
 } StgMutArrPtrs;
 
 typedef struct {
@@ -202,6 +171,23 @@ typedef struct {
     StgMutClosure *mut_link;
 } StgMutVar;
 
+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 */
+} StgBCO;
+
+/* 
+   A collective typedef for all linkable stack frames i.e.
+     StgUpdateFrame, StgSeqFrame, StgCatchFrame
+*/
+typedef struct _StgFrame {
+    StgHeader  header;
+    struct _StgFrame *link;
+} StgFrame;
+
 typedef struct _StgUpdateFrame {
     StgHeader  header;
     struct _StgUpdateFrame *link;
@@ -216,6 +202,7 @@ typedef struct {
 typedef struct {
     StgHeader  header;
     struct _StgUpdateFrame *link;
+    StgInt      exceptions_blocked;
     StgClosure *handler;
 } StgCatchFrame;
 
@@ -247,25 +234,30 @@ typedef struct _StgStableName {
   StgHeader      header;
   StgWord        sn;
 } StgStableName;
-  
+
 typedef struct _StgWeak {      /* Weak v */
   StgHeader header;
   StgClosure *key;
   StgClosure *value;           /* v */
-  StgClosure *finaliser;
+  StgClosure *finalizer;
   struct _StgWeak *link;
 } StgWeak;
 
+typedef struct _StgDeadWeak {  /* Weak v */
+  StgHeader header;
+  struct _StgWeak *link;
+} StgDeadWeak;
+
 /* Dynamic stack frames - these have a liveness mask in the object
  * itself, rather than in the info table.  Useful for generic heap
  * check code.
  */
  
 typedef struct {
-  StgHeader      header;
+  const struct _StgInfoTable* info;
   StgWord        liveness;
   StgWord        ret_addr;
-  StgWord        payload[0];
+  StgWord        payload[FLEXIBLE_ARRAY];
 } StgRetDyn;
 
 /* Concurrent communication objects */
@@ -278,12 +270,82 @@ typedef struct {
   StgClosure*     value;
 } StgMVar;
 
-/* Parallel FETCH_ME closures */
-#ifdef PAR
-typedef struct {
+#if defined(PAR) || defined(GRAN)
+/*
+  StgBlockingQueueElement is a ``collective type'' representing the types
+  of closures that can be found on a blocking queue: StgTSO, StgRBHSave,
+  StgBlockedFetch.  (StgRBHSave can only appear at the end of a blocking
+  queue).  Logically, this is a union type, but defining another struct
+  with a common layout is easier to handle in the code (same as for
+  StgMutClosures).  
+  Note that in the standard setup only StgTSOs can be on a blocking queue.
+  This is one of the main reasons for slightly different code in files
+  such as Schedule.c.
+*/
+typedef struct StgBlockingQueueElement_ {
+  StgHeader                         header;
+  struct StgBlockingQueueElement_  *link;      /* next elem in BQ */
+  StgMutClosure                    *mut_link;  /* next elem in mutable list */
+  struct StgClosure_               *payload[FLEXIBLE_ARRAY];/* contents of the closure */
+} StgBlockingQueueElement;
+
+/* only difference to std code is type of the elem in the BQ */
+typedef struct StgBlockingQueue_ {
+  StgHeader                 header;
+  struct StgBlockingQueueElement_ *blocking_queue; /* start of the BQ */
+  StgMutClosure            *mut_link;              /* next elem in mutable list */
+} StgBlockingQueue;
+
+/* this closure is hanging at the end of a blocking queue in (see RBH.c) */
+typedef struct StgRBHSave_ {
   StgHeader    header;
-  void        *ga;             /* type globalAddr is abstract here */
+  StgClosure  *payload[FLEXIBLE_ARRAY];     /* 2 words ripped out of the guts of the */
+} StgRBHSave;                  /*  closure holding the blocking queue */
+typedef struct StgRBH_ {
+  StgHeader                         header;
+  struct StgBlockingQueueElement_  *blocking_queue; /* start of the BQ */
+  StgMutClosure                    *mut_link;       /* next elem in mutable list */
+} StgRBH;
+
+#else
+
+typedef struct StgBlockingQueue_ {
+  StgHeader          header;
+  struct StgTSO_    *blocking_queue;
+  StgMutClosure     *mut_link;
+} StgBlockingQueue;
+
+#endif
+
+#if defined(PAR)
+/* global indirections aka FETCH_ME closures */
+typedef struct StgFetchMe_ {
+  StgHeader              header;
+  globalAddr            *ga;        /* ptr to unique id for a closure */
+  StgMutClosure         *mut_link;  /* next elem in mutable list */
 } StgFetchMe;
+
+/* same contents as an ordinary StgBlockingQueue */
+typedef struct StgFetchMeBlockingQueue_ {
+  StgHeader                          header;
+  struct StgBlockingQueueElement_   *blocking_queue; /* start of the BQ */
+  StgMutClosure                     *mut_link;       /* next elem in mutable list */
+} StgFetchMeBlockingQueue;
+
+/* This is an entry in a blocking queue. It indicates a fetch request from a 
+   TSO on another PE demanding the value of this closur. Note that a
+   StgBlockedFetch can only occur in a BQ. Once the node is evaluated and
+   updated with the result, the result will be sent back (the PE is encoded
+   in the globalAddr) and the StgBlockedFetch closure will be nuked.
+*/
+typedef struct StgBlockedFetch_ {
+  StgHeader                         header;
+  struct StgBlockingQueueElement_  *link;     /* next elem in the BQ */
+  StgMutClosure                    *mut_link; /* next elem in mutable list */
+  StgClosure                       *node;     /* node to fetch */
+  globalAddr                        ga;       /* where to send the result to */
+} StgBlockedFetch;                            /* NB: not just a ptr to a GA */
 #endif
 
 #endif /* CLOSURES_H */