Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/027a654c2003569a6fb74f86a9548101ecd1ffa9

>---------------------------------------------------------------

commit 027a654c2003569a6fb74f86a9548101ecd1ffa9
Author: Simon Marlow <[email protected]>
Date:   Fri Sep 7 17:01:24 2012 +0100

    Small parallel GC improvement
    
    Overlap the main thread's clearNursery() with the other threads.

>---------------------------------------------------------------

 rts/sm/GC.c |   14 ++++++++++++--
 1 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/rts/sm/GC.c b/rts/sm/GC.c
index 7bdaef5..9360645 100644
--- a/rts/sm/GC.c
+++ b/rts/sm/GC.c
@@ -404,6 +404,10 @@ GarbageCollect (nat collect_gen,
       break;
   }
 
+  if (n_gc_threads != 1) {
+      gct->allocated = clearNursery(cap);
+  }
+
   shutdown_gc_threads(gct->thread_index);
 
   // Now see which stable names are still alive.
@@ -636,9 +640,15 @@ GarbageCollect (nat collect_gen,
           allocated += clearNursery(&capabilities[n]);
       }
   } else {
-      gct->allocated = clearNursery(cap);
+      // When doing parallel GC, clearNursery() is called by the
+      // worker threads, and the value returned is stored in
+      // gct->allocated.
       for (n = 0; n < n_capabilities; n++) {
-          allocated += gc_threads[n]->allocated;
+          if (gc_threads[n]->idle) {
+              allocated += clearNursery(&capabilities[n]);
+          } else {
+              allocated += gc_threads[n]->allocated;
+          }
       }
   }
 



_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to