[project @ 2005-11-28 14:39:47 by simonmar]
[ghc-hetmet.git] / ghc / rts / Updates.h
index 06f67e9..0ec619a 100644 (file)
@@ -204,16 +204,14 @@ extern void awakenBlockedQueue(StgBlockingQueueElement *q, StgClosure *node);
   W_ sz;                                                               \
   W_ i;                                                                        \
   inf = %GET_STD_INFO(p);                                              \
-  if (%INFO_TYPE(inf) == HALF_W_(THUNK_SELECTOR)) {                    \
-       StgThunk_payload(p,0) = 0;                                      \
-  } else {                                                             \
+  if (%INFO_TYPE(inf) != HALF_W_(THUNK_SELECTOR)) {                    \
     if (%INFO_TYPE(inf) != HALF_W_(BLACKHOLE)) {                       \
       if (%INFO_TYPE(inf) == HALF_W_(AP_STACK)) {                      \
           sz = StgAP_STACK_size(p) + BYTES_TO_WDS(SIZEOF_StgAP_STACK_NoHdr); \
       } else {                                                         \
           sz = TO_W_(%INFO_PTRS(inf)) + TO_W_(%INFO_NPTRS(inf));       \
       }                                                                        \
-      i = 0;                                                           \
+      i = 1; /* skip over indirectee */                                        \
       for:                                                             \
         if (i < sz) {                                                  \
           StgThunk_payload(p,i) = 0;                                   \
@@ -232,20 +230,17 @@ DEBUG_FILL_SLOP(StgClosure *p)
 
     switch (inf->type) {
     case BLACKHOLE:
+    case THUNK_SELECTOR:
        return;
     case AP_STACK:
        sz = ((StgAP_STACK *)p)->size + sizeofW(StgAP_STACK) - sizeofW(StgHeader);
        break;
-    case THUNK_SELECTOR:
-#ifdef SMP
-       ((StgSelector *)p)->selectee = 0;
-#endif
-       return;
     default:
        sz = inf->layout.payload.ptrs + inf->layout.payload.nptrs;
         break;
     }
-    for (i = 0; i < sz; i++) {
+    // start at one to skip over the indirectee
+    for (i = 1; i < sz; i++) {
        ((StgThunk *)p)->payload[i] = 0;
     }
 }
@@ -268,26 +263,24 @@ DEBUG_FILL_SLOP(StgClosure *p)
 #define updateWithIndirection(ind_info, p1, p2, and_then)      \
     W_ bd;                                                     \
                                                                \
-/*    ASSERT( p1 != p2 && !closure_IND(p1) );                  \
- */ LDV_RECORD_DEAD_FILL_SLOP_DYNAMIC(p1);                     \
-/*  foreign "C" cas(p1 "ptr", 0, stg_WHITEHOLE_info);          \
- */ bd = Bdescr(p1);                                           \
-    if (bdescr_gen_no(bd) == 0 :: CInt) {                      \
-      StgInd_indirectee(p1) = p2;                              \
-      SET_INFO(p1, ind_info);                                  \
-      LDV_RECORD_CREATE(p1);                                   \
-      TICK_UPD_NEW_IND();                                      \
-      and_then;                                                        \
-    } else {                                                   \
-      DEBUG_FILL_SLOP(p1);                                     \
-      foreign "C" recordMutableCap(p1 "ptr",                   \
-                                  MyCapability() "ptr",        \
+    DEBUG_FILL_SLOP(p1);                                       \
+    LDV_RECORD_DEAD_FILL_SLOP_DYNAMIC(p1);                     \
+    StgInd_indirectee(p1) = p2;                                        \
+    foreign "C" wb() [];                                       \
+    bd = Bdescr(p1);                                           \
+    if (bdescr_gen_no(bd) != 0 :: CInt) {                      \
+      foreign "C" recordMutableCap(p1 "ptr",                   \
+                                  MyCapability() "ptr",        \
                                   bdescr_gen_no(bd));          \
-      StgInd_indirectee(p1) = p2;                              \
       SET_INFO(p1, stg_IND_OLDGEN_info);                       \
       LDV_RECORD_CREATE(p1);                                   \
       TICK_UPD_OLD_IND();                                      \
       and_then;                                                        \
+    } else {                                                   \
+      SET_INFO(p1, ind_info);                                  \
+      LDV_RECORD_CREATE(p1);                                   \
+      TICK_UPD_NEW_IND();                                      \
+      and_then;                                                        \
   }
 #else
 #define updateWithIndirection(ind_info, p1, p2, and_then)              \
@@ -296,21 +289,21 @@ DEBUG_FILL_SLOP(StgClosure *p)
                                                                        \
     /* cas(p1, 0, &stg_WHITEHOLE_info); */                             \
     ASSERT( (P_)p1 != (P_)p2 && !closure_IND(p1) );                    \
+    DEBUG_FILL_SLOP(p1);                                               \
     LDV_RECORD_DEAD_FILL_SLOP_DYNAMIC(p1);                             \
+    ((StgInd *)p1)->indirectee = p2;                                   \
+    wb();                                                              \
     bd = Bdescr((P_)p1);                                               \
-    if (bd->gen_no == 0) {                                             \
-      ((StgInd *)p1)->indirectee = p2;                                 \
-      SET_INFO(p1, ind_info);                                          \
-      LDV_RECORD_CREATE(p1);                                           \
-      TICK_UPD_NEW_IND();                                              \
-      and_then;                                                                \
-    } else {                                                           \
-      DEBUG_FILL_SLOP(p1);                                             \
+    if (bd->gen_no != 0) {                                             \
       recordMutableGenLock(p1, &generations[bd->gen_no]);              \
-      ((StgInd *)p1)->indirectee = p2;                                 \
       SET_INFO(p1, &stg_IND_OLDGEN_info);                              \
       TICK_UPD_OLD_IND();                                              \
       and_then;                                                                \
+    } else {                                                           \
+      SET_INFO(p1, ind_info);                                          \
+      LDV_RECORD_CREATE(p1);                                           \
+      TICK_UPD_NEW_IND();                                              \
+      and_then;                                                                \
     }                                                                  \
   }
 #endif
@@ -335,25 +328,25 @@ updateWithPermIndirection(StgClosure *p1,
   LDV_RECORD_DEAD_FILL_SLOP_DYNAMIC(p1);
 
   bd = Bdescr((P_)p1);
-  if (bd->gen_no == 0) {
+  if (bd->gen_no != 0) {
+    recordMutableGenLock(p1, &generations[bd->gen_no]);
     ((StgInd *)p1)->indirectee = p2;
-    SET_INFO(p1, &stg_IND_PERM_info);
+    SET_INFO(p1, &stg_IND_OLDGEN_PERM_info);
     /*
      * @LDV profiling
      * We have just created a new closure.
      */
     LDV_RECORD_CREATE(p1);
-    TICK_UPD_NEW_PERM_IND(p1);
+    TICK_UPD_OLD_PERM_IND();
   } else {
-    recordMutableGenLock(p1, &generations[bd->gen_no]);
     ((StgInd *)p1)->indirectee = p2;
-    SET_INFO(p1, &stg_IND_OLDGEN_PERM_info);
+    SET_INFO(p1, &stg_IND_PERM_info);
     /*
      * @LDV profiling
      * We have just created a new closure.
      */
     LDV_RECORD_CREATE(p1);
-    TICK_UPD_OLD_PERM_IND();
+    TICK_UPD_NEW_PERM_IND(p1);
   }
 }
 #endif