New implementation of BLACKHOLEs
[ghc-hetmet.git] / rts / sm / GC.c
index dc4c68f..4d63724 100644 (file)
@@ -140,7 +140,6 @@ static nat  initialise_N            (rtsBool force_major_gc);
 static void init_collected_gen      (nat g, nat threads);
 static void init_uncollected_gen    (nat g, nat threads);
 static void init_gc_thread          (gc_thread *t);
-static void update_task_list        (void);
 static void resize_generations      (void);
 static void resize_nursery          (void);
 static void start_gc_threads        (void);
@@ -396,13 +395,6 @@ SET_GCT(gc_threads[0]);
       // The other threads are now stopped.  We might recurse back to
       // here, but from now on this is the only thread.
       
-      // if any blackholes are alive, make the threads that wait on
-      // them alive too.
-      if (traverseBlackholeQueue()) {
-         inc_running(); 
-         continue;
-      }
-  
       // must be last...  invariant is that everything is fully
       // scavenged at this point.
       if (traverseWeakPtrList()) { // returns rtsTrue if evaced something 
@@ -416,9 +408,6 @@ SET_GCT(gc_threads[0]);
 
   shutdown_gc_threads(n_gc_threads, gct->thread_index);
 
-  // Update pointers from the Task list
-  update_task_list();
-
   // Now see which stable names are still alive.
   gcStablePtrTable();
 
@@ -649,6 +638,7 @@ SET_GCT(gc_threads[0]);
         freeChain(gen->large_objects);
         gen->large_objects  = gen->scavenged_large_objects;
         gen->n_large_blocks = gen->n_scavenged_large_blocks;
+       gen->n_new_large_blocks = 0;
         ASSERT(countBlocks(gen->large_objects) == gen->n_large_blocks);
     }
     else // for generations > N
@@ -735,7 +725,6 @@ SET_GCT(gc_threads[0]);
   // send exceptions to any threads which were about to die 
   RELEASE_SM_LOCK;
   resurrectThreads(resurrected_threads);
-  performPendingThrowTos(exception_threads);
   ACQUIRE_SM_LOCK;
 
   // Update the stable pointer hash table.
@@ -1000,6 +989,9 @@ any_work (void)
 #endif
 
     gct->no_work++;
+#if defined(THREADED_RTS)
+    yieldThread();
+#endif
 
     return rtsFalse;
 }    
@@ -1011,7 +1003,7 @@ scavenge_until_all_done (void)
        
 
 loop:
-    traceEvent(&capabilities[gct->thread_index], EVENT_GC_WORK);
+    traceEventGcWork(&capabilities[gct->thread_index]);
 
 #if defined(THREADED_RTS)
     if (n_gc_threads > 1) {
@@ -1026,7 +1018,7 @@ loop:
     // scavenge_loop() only exits when there's no work to do
     r = dec_running();
     
-    traceEvent(&capabilities[gct->thread_index], EVENT_GC_IDLE);
+    traceEventGcIdle(&capabilities[gct->thread_index]);
 
     debugTrace(DEBUG_gc, "%d GC threads still running", r);
     
@@ -1042,7 +1034,7 @@ loop:
         // scavenge_loop() to perform any pending work.
     }
     
-    traceEvent(&capabilities[gct->thread_index], EVENT_GC_DONE);
+    traceEventGcDone(&capabilities[gct->thread_index]);
 }
 
 #if defined(THREADED_RTS)
@@ -1451,39 +1443,6 @@ zero_static_object_list(StgClosure* first_static)
 }
 
 /* ----------------------------------------------------------------------------
-   Update the pointers from the task list
-
-   These are treated as weak pointers because we want to allow a main
-   thread to get a BlockedOnDeadMVar exception in the same way as any
-   other thread.  Note that the threads should all have been retained
-   by GC by virtue of being on the all_threads list, we're just
-   updating pointers here.
-   ------------------------------------------------------------------------- */
-
-static void
-update_task_list (void)
-{
-    Task *task;
-    StgTSO *tso;
-    for (task = all_tasks; task != NULL; task = task->all_link) {
-       if (!task->stopped && task->tso) {
-           ASSERT(task->tso->bound == task);
-           tso = (StgTSO *) isAlive((StgClosure *)task->tso);
-           if (tso == NULL) {
-               barf("task %p: main thread %d has been GC'd", 
-#ifdef THREADED_RTS
-                    (void *)task->id, 
-#else
-                    (void *)task,
-#endif
-                    task->tso->id);
-           }
-           task->tso = tso;
-       }
-    }
-}
-
-/* ----------------------------------------------------------------------------
    Reset the sizes of the older generations when we do a major
    collection.