[project @ 2005-03-27 13:41:13 by panne]
[ghc-hetmet.git] / ghc / includes / Updates.h
index 208c9f0..cf8b8cd 100644 (file)
  * impedence matching:
  */
 #ifdef CMINUSMINUS
+#define BLOCK_BEGIN
+#define BLOCK_END
 #define DECLARE_IPTR(info)  W_ info
 #define FCALL               foreign "C"
 #define INFO_PTR(info)      info
 #define ARG_PTR             "ptr"
 #else
+#define BLOCK_BEGIN         {
+#define BLOCK_END           }
 #define DECLARE_IPTR(info)  const StgInfoTable *(info)
 #define FCALL               /* nothing */
 #define INFO_PTR(info)      &info
 /* UPD_IND actually does a PERM_IND if TICKY_TICKY is on;
    if you *really* need an IND use UPD_REAL_IND
  */
-#define UPD_REAL_IND(updclosure, ind_info, heapptr, and_then)          \
-       DECLARE_IPTR(info);                                             \
-       info = GET_INFO(updclosure);                                    \
-        AWAKEN_BQ(info,updclosure);                                    \
-       updateWithIndirection(GET_INFO(updclosure), ind_info,           \
-                             updclosure,                               \
-                             heapptr,                                  \
-                             and_then);
+#define UPD_REAL_IND(updclosure, ind_info, heapptr, and_then)  \
+        BLOCK_BEGIN                                            \
+       DECLARE_IPTR(info);                                     \
+       info = GET_INFO(updclosure);                            \
+        AWAKEN_BQ(info,updclosure);                            \
+       updateWithIndirection(GET_INFO(updclosure), ind_info,   \
+                             updclosure,                       \
+                             heapptr,                          \
+                             and_then);                        \
+       BLOCK_END
 
 #if defined(PROFILING) || defined(TICKY_TICKY)
 #define UPD_PERM_IND(updclosure, heapptr)      \
+        BLOCK_BEGIN                            \
        DECLARE_IPTR(info);                     \
        info = GET_INFO(updclosure);            \
         AWAKEN_BQ(info,updclosure);            \
        updateWithPermIndirection(info,         \
                                  updclosure,   \
-                                 heapptr);
+                                 heapptr);     \
+       BLOCK_END
 #endif
 
 #if defined(RTS_SUPPORTS_THREADS)
 
 # ifdef TICKY_TICKY
 #  define UPD_IND_NOLOCK(updclosure, heapptr)  \
+        BLOCK_BEGIN                            \
        DECLARE_IPTR(info);                     \
        info = GET_INFO(updclosure);            \
         AWAKEN_BQ_NOLOCK(info,updclosure);     \
        updateWithPermIndirection(info,         \
                                  updclosure,   \
-                                 heapptr)
+                                 heapptr);     \
+       BLOCK_END
 # else
-#  define UPD_IND_NOLOCK(updclosure, heapptr)          \
-       DECLARE_IPTR(info);                             \
-       info = GET_INFO(updclosure);                    \
-        AWAKEN_BQ_NOLOCK(info,updclosure);             \
-       updateWithIndirection(info,stg_IND_info,        \
-                             updclosure,               \
-                             heapptr,); 
+#  define UPD_IND_NOLOCK(updclosure, heapptr)                  \
+        BLOCK_BEGIN                                            \
+       DECLARE_IPTR(info);                                     \
+       info = GET_INFO(updclosure);                            \
+        AWAKEN_BQ_NOLOCK(info,updclosure);                     \
+       updateWithIndirection(info, INFO_PTR(stg_IND_info),     \
+                             updclosure,                       \
+                             heapptr,);                        \
+       BLOCK_END
 # endif
 
 #else
@@ -226,7 +238,7 @@ extern void awakenBlockedQueue(StgBlockingQueueElement *q, StgClosure *node);
   inf = %GET_STD_INFO(p);                      \
   np = TO_W_(%INFO_PTRS(inf));                 \
   nw = TO_W_(%INFO_NPTRS(inf));                        \
-  if (%INFO_TYPE(inf) != THUNK_SELECTOR::I16) {        \
+  if (%INFO_TYPE(inf) != HALF_W_(THUNK_SELECTOR)) {    \
     i = 0;                                     \
     for:                                       \
       if (i < np + nw) {                       \
@@ -273,7 +285,7 @@ DEBUG_FILL_SLOP(StgClosure *p)
 /*    ASSERT( p1 != p2 && !closure_IND(p1) );                  \
  */ LDV_RECORD_DEAD_FILL_SLOP_DYNAMIC(p1);                     \
     bd = Bdescr(p1);                                           \
-    if (bdescr_gen_no(bd) == 0) {                              \
+    if (bdescr_gen_no(bd) == 0 :: CInt) {                      \
       StgInd_indirectee(p1) = p2;                              \
       SET_INFO(p1, ind_info);                                  \
       LDV_RECORD_CREATE(p1);                                   \
@@ -282,11 +294,8 @@ DEBUG_FILL_SLOP(StgClosure *p)
     } else {                                                   \
       if (info != stg_BLACKHOLE_BQ_info) {                     \
         DEBUG_FILL_SLOP(p1);                                   \
-        W_ __mut_once_list;                                    \
-        __mut_once_list = generation(bdescr_gen_no(bd)) +      \
-                             OFFSET_generation_mut_once_list;  \
-        StgMutClosure_mut_link(p1) = W_[__mut_once_list];      \
-        W_[__mut_once_list] = p1;                              \
+        foreign "C" recordMutableGen(p1 "ptr",                         \
+                generation(TO_W_(bdescr_gen_no(bd))) "ptr");   \
       }                                                                \
       StgInd_indirectee(p1) = p2;                              \
       SET_INFO(p1, stg_IND_OLDGEN_info);                       \
@@ -311,10 +320,9 @@ DEBUG_FILL_SLOP(StgClosure *p)
     } else {                                                           \
       if (_info != &stg_BLACKHOLE_BQ_info) {                           \
         DEBUG_FILL_SLOP(p1);                                           \
-        ((StgIndOldGen *)p1)->mut_link = generations[bd->gen_no].mut_once_list;        \
-        generations[bd->gen_no].mut_once_list = (StgMutClosure *)p1;    \
+        recordMutableGen(p1, &generations[bd->gen_no]);                        \
       }                                                                        \
-      ((StgIndOldGen *)p1)->indirectee = p2;                           \
+      ((StgInd *)p1)->indirectee = p2;                                 \
       SET_INFO(p1, &stg_IND_OLDGEN_info);                              \
       TICK_UPD_OLD_IND();                                              \
       and_then;                                                                \
@@ -335,28 +343,33 @@ updateWithPermIndirection(const StgInfoTable *info,
 
   ASSERT( p1 != p2 && !closure_IND(p1) );
 
-  // @LDV profiling
-  // Destroy the old closure.
-  // Nb: LDV_* stuff cannot mix with ticky-ticky
+  /*
+   * @LDV profiling
+   * Destroy the old closure.
+   * Nb: LDV_* stuff cannot mix with ticky-ticky
+   */
   LDV_RECORD_DEAD_FILL_SLOP_DYNAMIC(p1);
 
   bd = Bdescr((P_)p1);
   if (bd->gen_no == 0) {
     ((StgInd *)p1)->indirectee = p2;
     SET_INFO(p1, &stg_IND_PERM_info);
-    // @LDV profiling
-    // We have just created a new closure.
+    /*
+     * @LDV profiling
+     * We have just created a new closure.
+     */
     LDV_RECORD_CREATE(p1);
     TICK_UPD_NEW_PERM_IND(p1);
   } else {
     if (info != &stg_BLACKHOLE_BQ_info) {
-      ((StgIndOldGen *)p1)->mut_link = generations[bd->gen_no].mut_once_list;
-      generations[bd->gen_no].mut_once_list = (StgMutClosure *)p1;
+       recordMutableGen(p1, &generations[bd->gen_no]);
     }
-    ((StgIndOldGen *)p1)->indirectee = p2;
+    ((StgInd *)p1)->indirectee = p2;
     SET_INFO(p1, &stg_IND_OLDGEN_PERM_info);
-    // @LDV profiling
-    // We have just created a new closure.
+    /*
+     * @LDV profiling
+     * We have just created a new closure.
+     */
     LDV_RECORD_CREATE(p1);
     TICK_UPD_OLD_PERM_IND();
   }