Use message-passing to implement throwTo in the RTS
[ghc-hetmet.git] / rts / RetainerProfile.c
index e963567..b7bc909 100644 (file)
 #define INLINE inline
 #endif
 
+#include "PosixSource.h"
 #include "Rts.h"
+
 #include "RtsUtils.h"
 #include "RetainerProfile.h"
 #include "RetainerSet.h"
 #include "Schedule.h"
 #include "Printer.h"
-#include "RtsFlags.h"
 #include "Weak.h"
-#include "Sanity.h"
+#include "sm/Sanity.h"
 #include "Profiling.h"
 #include "Stats.h"
 #include "ProfHeap.h"
 #include "Apply.h"
+#include "sm/Storage.h" // for END_OF_STATIC_LIST
 
 /*
   Note: what to change in order to plug-in a new retainer profiling scheme?
@@ -453,8 +455,6 @@ push( StgClosure *c, retainer c_child_r, StgClosure **first_child )
     case CONSTR_0_2:
     case CAF_BLACKHOLE:
     case BLACKHOLE:
-    case SE_BLACKHOLE:
-    case SE_CAF_BLACKHOLE:
     case ARR_WORDS:
        *first_child = NULL;
        return;
@@ -509,7 +509,7 @@ push( StgClosure *c, retainer c_child_r, StgClosure **first_child )
 
        // layout.payload.ptrs, no SRT
     case CONSTR:
-    case STABLE_NAME:
+    case PRIM:
     case BCO:
     case CONSTR_STATIC:
        init_ptrs(&se.info, get_itbl(c)->layout.payload.ptrs,
@@ -621,12 +621,6 @@ push( StgClosure *c, retainer c_child_r, StgClosure **first_child )
     case RET_BIG:
        // invalid objects
     case IND:
-    case BLOCKED_FETCH:
-    case FETCH_ME:
-    case FETCH_ME_BQ:
-    case RBH:
-    case REMOTE_REF:
-    case EVACUATED:
     case INVALID_OBJECT:
     default:
        barf("Invalid object *c in push()");
@@ -889,7 +883,7 @@ pop( StgClosure **c, StgClosure **cp, retainer *r )
        }
 
        case CONSTR:
-       case STABLE_NAME:
+       case PRIM:
        case BCO:
        case CONSTR_STATIC:
            // StgMutArrPtr.ptrs, no SRT
@@ -959,8 +953,6 @@ pop( StgClosure **c, StgClosure **cp, retainer *r )
        case CONSTR_0_2:
        case CAF_BLACKHOLE:
        case BLACKHOLE:
-       case SE_BLACKHOLE:
-       case SE_CAF_BLACKHOLE:
        case ARR_WORDS:
            // one child (fixed), no SRT
        case MUT_VAR_CLEAN:
@@ -987,12 +979,6 @@ pop( StgClosure **c, StgClosure **cp, retainer *r )
        case RET_BIG:
            // invalid objects
        case IND:
-       case BLOCKED_FETCH:
-       case FETCH_ME:
-       case FETCH_ME_BQ:
-       case RBH:
-       case REMOTE_REF:
-       case EVACUATED:
        case INVALID_OBJECT:
        default:
            barf("Invalid object *c in pop()");
@@ -1114,8 +1100,6 @@ isRetainer( StgClosure *c )
        // blackholes
     case CAF_BLACKHOLE:
     case BLACKHOLE:
-    case SE_BLACKHOLE:
-    case SE_CAF_BLACKHOLE:
        // indirection
     case IND_PERM:
     case IND_OLDGEN_PERM:
@@ -1124,7 +1108,7 @@ isRetainer( StgClosure *c )
     case CONSTR_STATIC:
     case FUN_STATIC:
        // misc
-    case STABLE_NAME:
+    case PRIM:
     case BCO:
     case ARR_WORDS:
        // STM
@@ -1152,12 +1136,6 @@ isRetainer( StgClosure *c )
     case RET_BIG:
        // other cases
     case IND:
-    case BLOCKED_FETCH:
-    case FETCH_ME:
-    case FETCH_ME_BQ:
-    case RBH:
-    case REMOTE_REF:
-    case EVACUATED:
     case INVALID_OBJECT:
     default:
        barf("Invalid object in isRetainer(): %d", get_itbl(c)->type);
@@ -1300,9 +1278,9 @@ retainSRT (StgClosure **srt, nat srt_bitmap, StgClosure *c, retainer c_child_r)
 
   while (bitmap != 0) {
       if ((bitmap & 1) != 0) {
-#ifdef ENABLE_WIN32_DLL_SUPPORT
+#if defined(__PIC__) && defined(mingw32_TARGET_OS)
          if ( (unsigned long)(*srt) & 0x1 ) {
-             retainClosure(*stgCast(StgClosure**,(stgCast(unsigned long, *srt) & ~0x1)), 
+             retainClosure(* (StgClosure**) ((unsigned long) (*srt) & ~0x1), 
                            c, c_child_r);
          } else {
              retainClosure(*srt,c,c_child_r);
@@ -1635,7 +1613,7 @@ inner_loop:
 #ifdef DEBUG_RETAINER
            debugBelch("ThreadRelocated encountered in retainClosure()\n");
 #endif
-           c = (StgClosure *)((StgTSO *)c)->link;
+           c = (StgClosure *)((StgTSO *)c)->_link;
            goto inner_loop;
        }
        break;
@@ -1800,7 +1778,7 @@ inner_loop:
  *  Compute the retainer set for every object reachable from *tl.
  * -------------------------------------------------------------------------- */
 static void
-retainRoot( StgClosure **tl )
+retainRoot(void *user STG_UNUSED, StgClosure **tl)
 {
     StgClosure *c;
 
@@ -1837,7 +1815,7 @@ computeRetainerSet( void )
     RetainerSet tmpRetainerSet;
 #endif
 
-    GetRoots(retainRoot);      // for scheduler roots
+    markCapabilities(retainRoot, NULL);        // for scheduler roots
 
     // This function is called after a major GC, when key, value, and finalizer
     // all are guaranteed to be valid, or reachable.
@@ -1846,10 +1824,10 @@ computeRetainerSet( void )
     // for retainer profilng.
     for (weak = weak_ptr_list; weak != NULL; weak = weak->link)
        // retainRoot((StgClosure *)weak);
-       retainRoot((StgClosure **)&weak);
+       retainRoot(NULL, (StgClosure **)&weak);
 
     // Consider roots from the stable ptr table.
-    markStablePtrTable(retainRoot);
+    markStablePtrTable(retainRoot, NULL);
 
     // The following code resets the rs field of each unvisited mutable
     // object (computing sumOfNewCostExtra and updating costArray[] when
@@ -1913,7 +1891,7 @@ computeRetainerSet( void )
  *    they are not taken into consideration in computing retainer sets.
  * -------------------------------------------------------------------------- */
 void
-resetStaticObjectForRetainerProfiling( void )
+resetStaticObjectForRetainerProfiling( StgClosure *static_objects )
 {
 #ifdef DEBUG_RETAINER
     nat count;
@@ -1923,7 +1901,7 @@ resetStaticObjectForRetainerProfiling( void )
 #ifdef DEBUG_RETAINER
     count = 0;
 #endif
-    p = scavenged_static_objects;
+    p = static_objects;
     while (p != END_OF_STATIC_LIST) {
 #ifdef DEBUG_RETAINER
        count++;