GC: rearrange storage to reduce memory accesses in the inner loop
[ghc-hetmet.git] / rts / sm / GC.c
1 /* -----------------------------------------------------------------------------
2  *
3  * (c) The GHC Team 1998-2006
4  *
5  * Generational garbage collector
6  *
7  * Documentation on the architecture of the Garbage Collector can be
8  * found in the online commentary:
9  * 
10  *   http://hackage.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage/GC
11  *
12  * ---------------------------------------------------------------------------*/
13
14 #include "PosixSource.h"
15 #include "Rts.h"
16 #include "RtsFlags.h"
17 #include "RtsUtils.h"
18 #include "Apply.h"
19 #include "OSThreads.h"
20 #include "LdvProfile.h"
21 #include "Updates.h"
22 #include "Stats.h"
23 #include "Schedule.h"
24 #include "Sanity.h"
25 #include "BlockAlloc.h"
26 #include "MBlock.h"
27 #include "ProfHeap.h"
28 #include "SchedAPI.h"
29 #include "Weak.h"
30 #include "Prelude.h"
31 #include "ParTicky.h"           // ToDo: move into Rts.h
32 #include "RtsSignals.h"
33 #include "STM.h"
34 #include "HsFFI.h"
35 #include "Linker.h"
36 #if defined(RTS_GTK_FRONTPANEL)
37 #include "FrontPanel.h"
38 #endif
39 #include "Trace.h"
40 #include "RetainerProfile.h"
41 #include "RaiseAsync.h"
42 #include "Sparks.h"
43 #include "Papi.h"
44
45 #include "GC.h"
46 #include "Compact.h"
47 #include "Evac.h"
48 #include "Scav.h"
49 #include "GCUtils.h"
50 #include "MarkWeak.h"
51 #include "Sparks.h"
52
53 #include <string.h> // for memset()
54
55 /* -----------------------------------------------------------------------------
56    Global variables
57    -------------------------------------------------------------------------- */
58
59 /* STATIC OBJECT LIST.
60  *
61  * During GC:
62  * We maintain a linked list of static objects that are still live.
63  * The requirements for this list are:
64  *
65  *  - we need to scan the list while adding to it, in order to
66  *    scavenge all the static objects (in the same way that
67  *    breadth-first scavenging works for dynamic objects).
68  *
69  *  - we need to be able to tell whether an object is already on
70  *    the list, to break loops.
71  *
72  * Each static object has a "static link field", which we use for
73  * linking objects on to the list.  We use a stack-type list, consing
74  * objects on the front as they are added (this means that the
75  * scavenge phase is depth-first, not breadth-first, but that
76  * shouldn't matter).  
77  *
78  * A separate list is kept for objects that have been scavenged
79  * already - this is so that we can zero all the marks afterwards.
80  *
81  * An object is on the list if its static link field is non-zero; this
82  * means that we have to mark the end of the list with '1', not NULL.  
83  *
84  * Extra notes for generational GC:
85  *
86  * Each generation has a static object list associated with it.  When
87  * collecting generations up to N, we treat the static object lists
88  * from generations > N as roots.
89  *
90  * We build up a static object list while collecting generations 0..N,
91  * which is then appended to the static object list of generation N+1.
92  */
93 StgClosure* static_objects;      // live static objects
94 StgClosure* scavenged_static_objects;   // static objects scavenged so far
95 #ifdef THREADED_RTS
96 SpinLock static_objects_sync;
97 #endif
98
99 /* N is the oldest generation being collected, where the generations
100  * are numbered starting at 0.  A major GC (indicated by the major_gc
101  * flag) is when we're collecting all generations.  We only attempt to
102  * deal with static objects and GC CAFs when doing a major GC.
103  */
104 nat N;
105 rtsBool major_gc;
106
107 /* Data used for allocation area sizing.
108  */
109 static lnat g0s0_pcnt_kept = 30; // percentage of g0s0 live at last minor GC 
110
111 /* Mut-list stats */
112 #ifdef DEBUG
113 nat mutlist_MUTVARS,
114     mutlist_MUTARRS,
115     mutlist_MVARS,
116     mutlist_OTHERS;
117 #endif
118
119 /* Thread-local data for each GC thread
120  */
121 gc_thread **gc_threads = NULL;
122 // gc_thread *gct = NULL;  // this thread's gct TODO: make thread-local
123
124 // Number of threads running in *this* GC.  Affects how many
125 // step->todos[] lists we have to look in to find work.
126 nat n_gc_threads;
127
128 // For stats:
129 long copied;        // *words* copied & scavenged during this GC
130
131 #ifdef THREADED_RTS
132 SpinLock recordMutableGen_sync;
133 #endif
134
135 /* -----------------------------------------------------------------------------
136    Static function declarations
137    -------------------------------------------------------------------------- */
138
139 static void mark_root               (StgClosure **root);
140 static void zero_static_object_list (StgClosure* first_static);
141 static void initialise_N            (rtsBool force_major_gc);
142 static void alloc_gc_threads        (void);
143 static void init_collected_gen      (nat g, nat threads);
144 static void init_uncollected_gen    (nat g, nat threads);
145 static void init_gc_thread          (gc_thread *t);
146 static void update_task_list        (void);
147 static void resize_generations      (void);
148 static void resize_nursery          (void);
149 static void start_gc_threads        (void);
150 static void gc_thread_work          (void);
151 static nat  inc_running             (void);
152 static nat  dec_running             (void);
153 static void wakeup_gc_threads       (nat n_threads);
154
155 #if 0 && defined(DEBUG)
156 static void gcCAFs                  (void);
157 #endif
158
159 /* -----------------------------------------------------------------------------
160    The mark bitmap & stack.
161    -------------------------------------------------------------------------- */
162
163 #define MARK_STACK_BLOCKS 4
164
165 bdescr *mark_stack_bdescr;
166 StgPtr *mark_stack;
167 StgPtr *mark_sp;
168 StgPtr *mark_splim;
169
170 // Flag and pointers used for falling back to a linear scan when the
171 // mark stack overflows.
172 rtsBool mark_stack_overflowed;
173 bdescr *oldgen_scan_bd;
174 StgPtr  oldgen_scan;
175
176 /* -----------------------------------------------------------------------------
177    GarbageCollect: the main entry point to the garbage collector.
178
179    Locks held: all capabilities are held throughout GarbageCollect().
180    -------------------------------------------------------------------------- */
181
182 void
183 GarbageCollect ( rtsBool force_major_gc )
184 {
185   bdescr *bd;
186   step *stp;
187   lnat live, allocated;
188   lnat oldgen_saved_blocks = 0;
189   gc_thread *saved_gct;
190   nat g, s, t;
191
192   // necessary if we stole a callee-saves register for gct:
193   saved_gct = gct;
194
195 #ifdef PROFILING
196   CostCentreStack *prev_CCS;
197 #endif
198
199   ACQUIRE_SM_LOCK;
200
201   debugTrace(DEBUG_gc, "starting GC");
202
203 #if defined(RTS_USER_SIGNALS)
204   if (RtsFlags.MiscFlags.install_signal_handlers) {
205     // block signals
206     blockUserSignals();
207   }
208 #endif
209
210   // tell the stats department that we've started a GC 
211   stat_startGC();
212
213   // tell the STM to discard any cached closures it's hoping to re-use
214   stmPreGCHook();
215
216 #ifdef DEBUG
217   mutlist_MUTVARS = 0;
218   mutlist_MUTARRS = 0;
219   mutlist_OTHERS = 0;
220 #endif
221
222   // attribute any costs to CCS_GC 
223 #ifdef PROFILING
224   prev_CCS = CCCS;
225   CCCS = CCS_GC;
226 #endif
227
228   /* Approximate how much we allocated.  
229    * Todo: only when generating stats? 
230    */
231   allocated = calcAllocated();
232
233   /* Figure out which generation to collect
234    */
235   initialise_N(force_major_gc);
236
237   /* Allocate + initialise the gc_thread structures.
238    */
239   alloc_gc_threads();
240
241   /* Start threads, so they can be spinning up while we finish initialisation.
242    */
243   start_gc_threads();
244
245   /* How many threads will be participating in this GC?
246    * We don't try to parallelise minor GC.
247    */
248 #if defined(THREADED_RTS)
249   if (N == 0) {
250       n_gc_threads = 1;
251   } else {
252       n_gc_threads = RtsFlags.ParFlags.gcThreads;
253   }
254 #else
255   n_gc_threads = 1;
256 #endif
257
258 #ifdef RTS_GTK_FRONTPANEL
259   if (RtsFlags.GcFlags.frontpanel) {
260       updateFrontPanelBeforeGC(N);
261   }
262 #endif
263
264 #ifdef DEBUG
265   // check for memory leaks if DEBUG is on 
266   memInventory(traceClass(DEBUG_gc));
267 #endif
268
269   // check stack sanity *before* GC (ToDo: check all threads) 
270   IF_DEBUG(sanity, checkFreeListSanity());
271
272   /* Initialise the static object lists
273    */
274   static_objects = END_OF_STATIC_LIST;
275   scavenged_static_objects = END_OF_STATIC_LIST;
276
277   // Initialise all the generations/steps that we're collecting.
278   for (g = 0; g <= N; g++) {
279       init_collected_gen(g,n_gc_threads);
280   }
281   
282   // Initialise all the generations/steps that we're *not* collecting.
283   for (g = N+1; g < RtsFlags.GcFlags.generations; g++) {
284       init_uncollected_gen(g,n_gc_threads);
285   }
286
287   /* Allocate a mark stack if we're doing a major collection.
288    */
289   if (major_gc) {
290       mark_stack_bdescr = allocGroup(MARK_STACK_BLOCKS);
291       mark_stack = (StgPtr *)mark_stack_bdescr->start;
292       mark_sp    = mark_stack;
293       mark_splim = mark_stack + (MARK_STACK_BLOCKS * BLOCK_SIZE_W);
294   } else {
295       mark_stack_bdescr = NULL;
296   }
297
298   // Initialise all our gc_thread structures
299   for (t = 0; t < n_gc_threads; t++) {
300       init_gc_thread(gc_threads[t]);
301   }
302
303   // the main thread is running: this prevents any other threads from
304   // exiting prematurely, so we can start them now.
305   inc_running();
306   wakeup_gc_threads(n_gc_threads);
307
308   // Initialise stats
309   copied = 0;
310
311   // this is the main thread
312   gct = gc_threads[0];
313
314   /* -----------------------------------------------------------------------
315    * follow all the roots that we know about:
316    *   - mutable lists from each generation > N
317    * we want to *scavenge* these roots, not evacuate them: they're not
318    * going to move in this GC.
319    * Also do them in reverse generation order, for the usual reason:
320    * namely to reduce the likelihood of spurious old->new pointers.
321    */
322   { 
323     for (g = RtsFlags.GcFlags.generations-1; g > N; g--) {
324       generations[g].saved_mut_list = generations[g].mut_list;
325       generations[g].mut_list = allocBlock(); 
326         // mut_list always has at least one block.
327     }
328     for (g = RtsFlags.GcFlags.generations-1; g > N; g--) {
329       scavenge_mutable_list(&generations[g]);
330     }
331   }
332
333   // follow roots from the CAF list (used by GHCi)
334   gct->evac_step = 0;
335   markCAFs(mark_root);
336
337   // follow all the roots that the application knows about.
338   gct->evac_step = 0;
339   GetRoots(mark_root);
340
341 #if defined(RTS_USER_SIGNALS)
342   // mark the signal handlers (signals should be already blocked)
343   markSignalHandlers(mark_root);
344 #endif
345
346   // Mark the weak pointer list, and prepare to detect dead weak pointers.
347   markWeakPtrList();
348   initWeakForGC();
349
350   // Mark the stable pointer table.
351   markStablePtrTable(mark_root);
352
353   /* -------------------------------------------------------------------------
354    * Repeatedly scavenge all the areas we know about until there's no
355    * more scavenging to be done.
356    */
357   for (;;)
358   {
359       gc_thread_work();
360       // The other threads are now stopped.  We might recurse back to
361       // here, but from now on this is the only thread.
362       
363       // if any blackholes are alive, make the threads that wait on
364       // them alive too.
365       if (traverseBlackholeQueue()) {
366           inc_running(); 
367           continue;
368       }
369   
370       // must be last...  invariant is that everything is fully
371       // scavenged at this point.
372       if (traverseWeakPtrList()) { // returns rtsTrue if evaced something 
373           inc_running();
374           continue;
375       }
376
377       // If we get to here, there's really nothing left to do.
378       break;
379   }
380
381   // Update pointers from the Task list
382   update_task_list();
383
384   // Now see which stable names are still alive.
385   gcStablePtrTable();
386
387 #ifdef PROFILING
388   // We call processHeapClosureForDead() on every closure destroyed during
389   // the current garbage collection, so we invoke LdvCensusForDead().
390   if (RtsFlags.ProfFlags.doHeapProfile == HEAP_BY_LDV
391       || RtsFlags.ProfFlags.bioSelector != NULL)
392     LdvCensusForDead(N);
393 #endif
394
395   // NO MORE EVACUATION AFTER THIS POINT!
396   // Finally: compaction of the oldest generation.
397   if (major_gc && oldest_gen->steps[0].is_compacted) {
398       // save number of blocks for stats
399       oldgen_saved_blocks = oldest_gen->steps[0].n_old_blocks;
400       compact();
401   }
402
403   IF_DEBUG(sanity, checkGlobalTSOList(rtsFalse));
404
405   // Two-space collector: free the old to-space.
406   // g0s0->old_blocks is the old nursery
407   // g0s0->blocks is to-space from the previous GC
408   if (RtsFlags.GcFlags.generations == 1) {
409       if (g0s0->blocks != NULL) {
410           freeChain(g0s0->blocks);
411           g0s0->blocks = NULL;
412       }
413   }
414
415   // For each workspace, in each thread:
416   //    * clear the BF_EVACUATED flag from each copied block
417   //    * move the copied blocks to the step
418   {
419       gc_thread *thr;
420       step_workspace *ws;
421       bdescr *prev;
422
423       for (t = 0; t < n_gc_threads; t++) {
424           thr = gc_threads[t];
425
426           // not step 0
427           for (s = 1; s < total_steps; s++) {
428               ws = &thr->steps[s];
429               // Not true?
430               // ASSERT( ws->scan_bd == ws->todo_bd );
431               ASSERT( ws->scan_bd ? ws->scan == ws->scan_bd->free : 1 );
432
433               // Push the final block
434               if (ws->scan_bd) { push_scan_block(ws->scan_bd, ws); }
435               
436               ASSERT(countBlocks(ws->scavd_list) == ws->n_scavd_blocks);
437               
438               prev = ws->scavd_list;
439               for (bd = ws->scavd_list; bd != NULL; bd = bd->link) {
440                   bd->flags &= ~BF_EVACUATED;    // now from-space 
441                   prev = bd;
442               }
443               prev->link = ws->stp->blocks;
444               ws->stp->blocks = ws->scavd_list;
445               ws->stp->n_blocks += ws->n_scavd_blocks;
446               ASSERT(countBlocks(ws->stp->blocks) == ws->stp->n_blocks);
447           }
448       }
449   }
450
451   // Two-space collector: swap the semi-spaces around.
452   // Currently: g0s0->old_blocks is the old nursery
453   //            g0s0->blocks is to-space from this GC
454   // We want these the other way around.
455   if (RtsFlags.GcFlags.generations == 1) {
456       bdescr *nursery_blocks = g0s0->old_blocks;
457       nat n_nursery_blocks = g0s0->n_old_blocks;
458       g0s0->old_blocks = g0s0->blocks;
459       g0s0->n_old_blocks = g0s0->n_blocks;
460       g0s0->blocks = nursery_blocks;
461       g0s0->n_blocks = n_nursery_blocks;
462   }
463
464   /* run through all the generations/steps and tidy up 
465    */
466   for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
467
468     if (g <= N) {
469       generations[g].collections++; // for stats 
470     }
471
472     // Count the mutable list as bytes "copied" for the purposes of
473     // stats.  Every mutable list is copied during every GC.
474     if (g > 0) {
475         nat mut_list_size = 0;
476         for (bd = generations[g].mut_list; bd != NULL; bd = bd->link) {
477             mut_list_size += bd->free - bd->start;
478         }
479         copied +=  mut_list_size;
480
481         debugTrace(DEBUG_gc,
482                    "mut_list_size: %lu (%d vars, %d arrays, %d MVARs, %d others)",
483                    (unsigned long)(mut_list_size * sizeof(W_)),
484                    mutlist_MUTVARS, mutlist_MUTARRS, mutlist_MVARS, mutlist_OTHERS);
485     }
486
487     for (s = 0; s < generations[g].n_steps; s++) {
488       bdescr *next;
489       stp = &generations[g].steps[s];
490
491       // for generations we collected... 
492       if (g <= N) {
493
494         /* free old memory and shift to-space into from-space for all
495          * the collected steps (except the allocation area).  These
496          * freed blocks will probaby be quickly recycled.
497          */
498         if (!(g == 0 && s == 0 && RtsFlags.GcFlags.generations > 1)) {
499             if (stp->is_compacted)
500             {
501                 // for a compacted step, just shift the new to-space
502                 // onto the front of the now-compacted existing blocks.
503                 for (bd = stp->blocks; bd != NULL; bd = bd->link) {
504                     bd->flags &= ~BF_EVACUATED;  // now from-space 
505                 }
506                 // tack the new blocks on the end of the existing blocks
507                 if (stp->old_blocks != NULL) {
508                     for (bd = stp->old_blocks; bd != NULL; bd = next) {
509                         // NB. this step might not be compacted next
510                         // time, so reset the BF_COMPACTED flags.
511                         // They are set before GC if we're going to
512                         // compact.  (search for BF_COMPACTED above).
513                         bd->flags &= ~BF_COMPACTED;
514                         next = bd->link;
515                         if (next == NULL) {
516                             bd->link = stp->blocks;
517                         }
518                     }
519                     stp->blocks = stp->old_blocks;
520                 }
521                 // add the new blocks to the block tally
522                 stp->n_blocks += stp->n_old_blocks;
523                 ASSERT(countBlocks(stp->blocks) == stp->n_blocks);
524             }
525             else // not copacted
526             {
527                 freeChain(stp->old_blocks);
528             }
529             stp->old_blocks = NULL;
530             stp->n_old_blocks = 0;
531         }
532
533         /* LARGE OBJECTS.  The current live large objects are chained on
534          * scavenged_large, having been moved during garbage
535          * collection from large_objects.  Any objects left on
536          * large_objects list are therefore dead, so we free them here.
537          */
538         for (bd = stp->large_objects; bd != NULL; bd = next) {
539           next = bd->link;
540           freeGroup(bd);
541           bd = next;
542         }
543
544         // update the count of blocks used by large objects
545         for (bd = stp->scavenged_large_objects; bd != NULL; bd = bd->link) {
546           bd->flags &= ~BF_EVACUATED;
547         }
548         stp->large_objects  = stp->scavenged_large_objects;
549         stp->n_large_blocks = stp->n_scavenged_large_blocks;
550
551       }
552       else // for older generations... 
553       {
554         /* For older generations, we need to append the
555          * scavenged_large_object list (i.e. large objects that have been
556          * promoted during this GC) to the large_object list for that step.
557          */
558         for (bd = stp->scavenged_large_objects; bd; bd = next) {
559           next = bd->link;
560           bd->flags &= ~BF_EVACUATED;
561           dbl_link_onto(bd, &stp->large_objects);
562         }
563
564         // add the new blocks we promoted during this GC 
565         stp->n_large_blocks += stp->n_scavenged_large_blocks;
566       }
567     }
568   }
569
570   // update the max size of older generations after a major GC
571   resize_generations();
572   
573   // Guess the amount of live data for stats.
574   live = calcLiveBlocks() * BLOCK_SIZE_W;
575   debugTrace(DEBUG_gc, "Slop: %ldKB", 
576              (live - calcLiveWords()) / (1024/sizeof(W_)));
577
578   // Free the small objects allocated via allocate(), since this will
579   // all have been copied into G0S1 now.  
580   if (RtsFlags.GcFlags.generations > 1) {
581       if (g0s0->blocks != NULL) {
582           freeChain(g0s0->blocks);
583           g0s0->blocks = NULL;
584       }
585       g0s0->n_blocks = 0;
586   }
587   alloc_blocks = 0;
588   alloc_blocks_lim = RtsFlags.GcFlags.minAllocAreaSize;
589
590   // Start a new pinned_object_block
591   pinned_object_block = NULL;
592
593   // Free the mark stack.
594   if (mark_stack_bdescr != NULL) {
595       freeGroup(mark_stack_bdescr);
596   }
597
598   // Free any bitmaps.
599   for (g = 0; g <= N; g++) {
600       for (s = 0; s < generations[g].n_steps; s++) {
601           stp = &generations[g].steps[s];
602           if (stp->bitmap != NULL) {
603               freeGroup(stp->bitmap);
604               stp->bitmap = NULL;
605           }
606       }
607   }
608
609   resize_nursery();
610
611  // mark the garbage collected CAFs as dead 
612 #if 0 && defined(DEBUG) // doesn't work at the moment 
613   if (major_gc) { gcCAFs(); }
614 #endif
615   
616 #ifdef PROFILING
617   // resetStaticObjectForRetainerProfiling() must be called before
618   // zeroing below.
619   resetStaticObjectForRetainerProfiling();
620 #endif
621
622   // zero the scavenged static object list 
623   if (major_gc) {
624     zero_static_object_list(scavenged_static_objects);
625   }
626
627   // Reset the nursery
628   resetNurseries();
629
630   // start any pending finalizers 
631   RELEASE_SM_LOCK;
632   scheduleFinalizers(last_free_capability, old_weak_ptr_list);
633   ACQUIRE_SM_LOCK;
634   
635   // send exceptions to any threads which were about to die 
636   RELEASE_SM_LOCK;
637   resurrectThreads(resurrected_threads);
638   ACQUIRE_SM_LOCK;
639
640   // Update the stable pointer hash table.
641   updateStablePtrTable(major_gc);
642
643   // check sanity after GC 
644   IF_DEBUG(sanity, checkSanity());
645
646   // extra GC trace info 
647   IF_DEBUG(gc, statDescribeGens());
648
649 #ifdef DEBUG
650   // symbol-table based profiling 
651   /*  heapCensus(to_blocks); */ /* ToDo */
652 #endif
653
654   // restore enclosing cost centre 
655 #ifdef PROFILING
656   CCCS = prev_CCS;
657 #endif
658
659 #ifdef DEBUG
660   // check for memory leaks if DEBUG is on 
661   memInventory(traceClass(DEBUG_gc));
662 #endif
663
664 #ifdef RTS_GTK_FRONTPANEL
665   if (RtsFlags.GcFlags.frontpanel) {
666       updateFrontPanelAfterGC( N, live );
667   }
668 #endif
669
670   // ok, GC over: tell the stats department what happened. 
671   stat_endGC(allocated, live, copied, N);
672
673 #if defined(RTS_USER_SIGNALS)
674   if (RtsFlags.MiscFlags.install_signal_handlers) {
675     // unblock signals again
676     unblockUserSignals();
677   }
678 #endif
679
680   RELEASE_SM_LOCK;
681
682   gct = saved_gct;
683 }
684
685 /* -----------------------------------------------------------------------------
686  * Mark all nodes pointed to by sparks in the spark queues (for GC) Does an
687  * implicit slide i.e. after marking all sparks are at the beginning of the
688  * spark pool and the spark pool only contains sparkable closures 
689  * -------------------------------------------------------------------------- */
690
691 #ifdef THREADED_RTS
692 static void
693 markSparkQueue (evac_fn evac, Capability *cap)
694
695     StgClosure **sparkp, **to_sparkp;
696     nat n, pruned_sparks; // stats only
697     StgSparkPool *pool;
698     
699     PAR_TICKY_MARK_SPARK_QUEUE_START();
700     
701     n = 0;
702     pruned_sparks = 0;
703     
704     pool = &(cap->r.rSparks);
705     
706     ASSERT_SPARK_POOL_INVARIANTS(pool);
707     
708 #if defined(PARALLEL_HASKELL)
709     // stats only
710     n = 0;
711     pruned_sparks = 0;
712 #endif
713         
714     sparkp = pool->hd;
715     to_sparkp = pool->hd;
716     while (sparkp != pool->tl) {
717         ASSERT(*sparkp!=NULL);
718         ASSERT(LOOKS_LIKE_CLOSURE_PTR(((StgClosure *)*sparkp)));
719         // ToDo?: statistics gathering here (also for GUM!)
720         if (closure_SHOULD_SPARK(*sparkp)) {
721             evac(sparkp);
722             *to_sparkp++ = *sparkp;
723             if (to_sparkp == pool->lim) {
724                 to_sparkp = pool->base;
725             }
726             n++;
727         } else {
728             pruned_sparks++;
729         }
730         sparkp++;
731         if (sparkp == pool->lim) {
732             sparkp = pool->base;
733         }
734     }
735     pool->tl = to_sparkp;
736         
737     PAR_TICKY_MARK_SPARK_QUEUE_END(n);
738         
739 #if defined(PARALLEL_HASKELL)
740     debugTrace(DEBUG_sched, 
741                "marked %d sparks and pruned %d sparks on [%x]",
742                n, pruned_sparks, mytid);
743 #else
744     debugTrace(DEBUG_sched, 
745                "marked %d sparks and pruned %d sparks",
746                n, pruned_sparks);
747 #endif
748     
749     debugTrace(DEBUG_sched,
750                "new spark queue len=%d; (hd=%p; tl=%p)\n",
751                sparkPoolSize(pool), pool->hd, pool->tl);
752 }
753 #endif
754
755 /* ---------------------------------------------------------------------------
756    Where are the roots that we know about?
757
758         - all the threads on the runnable queue
759         - all the threads on the blocked queue
760         - all the threads on the sleeping queue
761         - all the thread currently executing a _ccall_GC
762         - all the "main threads"
763      
764    ------------------------------------------------------------------------ */
765
766 void
767 GetRoots( evac_fn evac )
768 {
769     nat i;
770     Capability *cap;
771     Task *task;
772
773     // Each GC thread is responsible for following roots from the
774     // Capability of the same number.  There will usually be the same
775     // or fewer Capabilities as GC threads, but just in case there
776     // are more, we mark every Capability whose number is the GC
777     // thread's index plus a multiple of the number of GC threads.
778     for (i = gct->thread_index; i < n_capabilities; i += n_gc_threads) {
779         cap = &capabilities[i];
780         evac((StgClosure **)(void *)&cap->run_queue_hd);
781         evac((StgClosure **)(void *)&cap->run_queue_tl);
782 #if defined(THREADED_RTS)
783         evac((StgClosure **)(void *)&cap->wakeup_queue_hd);
784         evac((StgClosure **)(void *)&cap->wakeup_queue_tl);
785 #endif
786         for (task = cap->suspended_ccalling_tasks; task != NULL; 
787              task=task->next) {
788             debugTrace(DEBUG_sched,
789                        "evac'ing suspended TSO %lu", (unsigned long)task->suspended_tso->id);
790             evac((StgClosure **)(void *)&task->suspended_tso);
791         }
792
793 #if defined(THREADED_RTS)
794         markSparkQueue(evac,cap);
795 #endif
796     }
797     
798 #if !defined(THREADED_RTS)
799     evac((StgClosure **)(void *)&blocked_queue_hd);
800     evac((StgClosure **)(void *)&blocked_queue_tl);
801     evac((StgClosure **)(void *)&sleeping_queue);
802 #endif 
803 }
804
805 /* -----------------------------------------------------------------------------
806    isAlive determines whether the given closure is still alive (after
807    a garbage collection) or not.  It returns the new address of the
808    closure if it is alive, or NULL otherwise.
809
810    NOTE: Use it before compaction only!
811          It untags and (if needed) retags pointers to closures.
812    -------------------------------------------------------------------------- */
813
814
815 StgClosure *
816 isAlive(StgClosure *p)
817 {
818   const StgInfoTable *info;
819   bdescr *bd;
820   StgWord tag;
821   StgClosure *q;
822
823   while (1) {
824     /* The tag and the pointer are split, to be merged later when needed. */
825     tag = GET_CLOSURE_TAG(p);
826     q = UNTAG_CLOSURE(p);
827
828     ASSERT(LOOKS_LIKE_CLOSURE_PTR(q));
829     info = get_itbl(q);
830
831     // ignore static closures 
832     //
833     // ToDo: for static closures, check the static link field.
834     // Problem here is that we sometimes don't set the link field, eg.
835     // for static closures with an empty SRT or CONSTR_STATIC_NOCAFs.
836     //
837     if (!HEAP_ALLOCED(q)) {
838         return p;
839     }
840
841     // ignore closures in generations that we're not collecting. 
842     bd = Bdescr((P_)q);
843     if (bd->gen_no > N) {
844         return p;
845     }
846
847     // if it's a pointer into to-space, then we're done
848     if (bd->flags & BF_EVACUATED) {
849         return p;
850     }
851
852     // large objects use the evacuated flag
853     if (bd->flags & BF_LARGE) {
854         return NULL;
855     }
856
857     // check the mark bit for compacted steps
858     if ((bd->flags & BF_COMPACTED) && is_marked((P_)q,bd)) {
859         return p;
860     }
861
862     switch (info->type) {
863
864     case IND:
865     case IND_STATIC:
866     case IND_PERM:
867     case IND_OLDGEN:            // rely on compatible layout with StgInd 
868     case IND_OLDGEN_PERM:
869       // follow indirections 
870       p = ((StgInd *)q)->indirectee;
871       continue;
872
873     case EVACUATED:
874       // alive! 
875       return ((StgEvacuated *)q)->evacuee;
876
877     case TSO:
878       if (((StgTSO *)q)->what_next == ThreadRelocated) {
879         p = (StgClosure *)((StgTSO *)q)->link;
880         continue;
881       } 
882       return NULL;
883
884     default:
885       // dead. 
886       return NULL;
887     }
888   }
889 }
890
891 /* -----------------------------------------------------------------------------
892    Figure out which generation to collect, initialise N and major_gc.
893    -------------------------------------------------------------------------- */
894
895 static void
896 initialise_N (rtsBool force_major_gc)
897 {
898     nat g;
899
900     if (force_major_gc) {
901         N = RtsFlags.GcFlags.generations - 1;
902         major_gc = rtsTrue;
903     } else {
904         N = 0;
905         for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
906             if (generations[g].steps[0].n_blocks +
907                 generations[g].steps[0].n_large_blocks
908                 >= generations[g].max_blocks) {
909                 N = g;
910             }
911         }
912         major_gc = (N == RtsFlags.GcFlags.generations-1);
913     }
914 }
915
916 /* -----------------------------------------------------------------------------
917    Initialise the gc_thread structures.
918    -------------------------------------------------------------------------- */
919
920 static gc_thread *
921 alloc_gc_thread (int n)
922 {
923     nat s;
924     step_workspace *ws;
925     gc_thread *t;
926
927     t = stgMallocBytes(sizeof(gc_thread) + total_steps * sizeof(step_workspace),
928                        "alloc_gc_thread");
929
930 #ifdef THREADED_RTS
931     t->id = 0;
932     initCondition(&t->wake_cond);
933     initMutex(&t->wake_mutex);
934     t->wakeup = rtsFalse;
935     t->exit   = rtsFalse;
936 #endif
937
938     t->thread_index = n;
939     t->free_blocks = NULL;
940     t->gc_count = 0;
941
942     init_gc_thread(t);
943     
944 #ifdef USE_PAPI
945     t->papi_events = -1;
946 #endif
947
948     for (s = 0; s < total_steps; s++)
949     {
950         ws = &t->steps[s];
951         ws->stp = &all_steps[s];
952         ASSERT(s == ws->stp->abs_no);
953         ws->gct = t;
954         
955         ws->scan_bd = NULL;
956         ws->scan = NULL;
957
958         ws->todo_bd = NULL;
959         ws->buffer_todo_bd = NULL;
960         
961         ws->scavd_list = NULL;
962         ws->n_scavd_blocks = 0;
963     }
964
965     return t;
966 }
967
968
969 static void
970 alloc_gc_threads (void)
971 {
972     if (gc_threads == NULL) {
973 #if defined(THREADED_RTS)
974         nat i;
975         gc_threads = stgMallocBytes (RtsFlags.ParFlags.gcThreads * 
976                                      sizeof(gc_thread*), 
977                                      "alloc_gc_threads");
978
979         for (i = 0; i < RtsFlags.ParFlags.gcThreads; i++) {
980             gc_threads[i] = alloc_gc_thread(i);
981         }
982 #else
983         gc_threads = stgMallocBytes (sizeof(gc_thread*), 
984                                      "alloc_gc_threads");
985
986         gc_threads[0] = alloc_gc_thread(0);
987 #endif
988     }
989 }
990
991 /* ----------------------------------------------------------------------------
992    Start GC threads
993    ------------------------------------------------------------------------- */
994
995 static nat gc_running_threads;
996
997 #if defined(THREADED_RTS)
998 static Mutex gc_running_mutex;
999 #endif
1000
1001 static nat
1002 inc_running (void)
1003 {
1004     nat n_running;
1005     ACQUIRE_LOCK(&gc_running_mutex);
1006     n_running = ++gc_running_threads;
1007     RELEASE_LOCK(&gc_running_mutex);
1008     return n_running;
1009 }
1010
1011 static nat
1012 dec_running (void)
1013 {
1014     nat n_running;
1015     ACQUIRE_LOCK(&gc_running_mutex);
1016     n_running = --gc_running_threads;
1017     RELEASE_LOCK(&gc_running_mutex);
1018     return n_running;
1019 }
1020
1021 //
1022 // gc_thread_work(): Scavenge until there's no work left to do and all
1023 // the running threads are idle.
1024 //
1025 static void
1026 gc_thread_work (void)
1027 {
1028     nat r;
1029         
1030     debugTrace(DEBUG_gc, "GC thread %d working", gct->thread_index);
1031
1032     // gc_running_threads has already been incremented for us; either
1033     // this is the main thread and we incremented it inside
1034     // GarbageCollect(), or this is a worker thread and the main
1035     // thread bumped gc_running_threads before waking us up.
1036
1037     // Every thread evacuates some roots.
1038     gct->evac_step = 0;
1039     GetRoots(mark_root);
1040
1041 loop:
1042     scavenge_loop();
1043     // scavenge_loop() only exits when there's no work to do
1044     r = dec_running();
1045     
1046     debugTrace(DEBUG_gc, "GC thread %d idle (%d still running)", 
1047                gct->thread_index, r);
1048
1049     while (gc_running_threads != 0) {
1050         if (any_work()) {
1051             inc_running();
1052             goto loop;
1053         }
1054         // any_work() does not remove the work from the queue, it
1055         // just checks for the presence of work.  If we find any,
1056         // then we increment gc_running_threads and go back to 
1057         // scavenge_loop() to perform any pending work.
1058     }
1059     
1060     // All threads are now stopped
1061     debugTrace(DEBUG_gc, "GC thread %d finished.", gct->thread_index);
1062 }
1063
1064
1065 #if defined(THREADED_RTS)
1066 static void
1067 gc_thread_mainloop (void)
1068 {
1069     while (!gct->exit) {
1070
1071         // Wait until we're told to wake up
1072         ACQUIRE_LOCK(&gct->wake_mutex);
1073         while (!gct->wakeup) {
1074             debugTrace(DEBUG_gc, "GC thread %d standing by...", 
1075                        gct->thread_index);
1076             waitCondition(&gct->wake_cond, &gct->wake_mutex);
1077         }
1078         RELEASE_LOCK(&gct->wake_mutex);
1079         gct->wakeup = rtsFalse;
1080         if (gct->exit) break;
1081
1082 #ifdef USE_PAPI
1083         // start performance counters in this thread...
1084         if (gct->papi_events == -1) {
1085             papi_init_eventset(&gct->papi_events);
1086         }
1087         papi_thread_start_gc1_count(gct->papi_events);
1088 #endif
1089
1090         gc_thread_work();
1091
1092 #ifdef USE_PAPI
1093         // count events in this thread towards the GC totals
1094         papi_thread_stop_gc1_count(gct->papi_events);
1095 #endif
1096     }
1097 }       
1098 #endif
1099
1100 #if defined(THREADED_RTS)
1101 static void
1102 gc_thread_entry (gc_thread *my_gct)
1103 {
1104     gct = my_gct;
1105     debugTrace(DEBUG_gc, "GC thread %d starting...", gct->thread_index);
1106     gct->id = osThreadId();
1107     gc_thread_mainloop();
1108 }
1109 #endif
1110
1111 static void
1112 start_gc_threads (void)
1113 {
1114 #if defined(THREADED_RTS)
1115     nat i;
1116     OSThreadId id;
1117     static rtsBool done = rtsFalse;
1118
1119     gc_running_threads = 0;
1120     initMutex(&gc_running_mutex);
1121
1122     if (!done) {
1123         // Start from 1: the main thread is 0
1124         for (i = 1; i < RtsFlags.ParFlags.gcThreads; i++) {
1125             createOSThread(&id, (OSThreadProc*)&gc_thread_entry, 
1126                            gc_threads[i]);
1127         }
1128         done = rtsTrue;
1129     }
1130 #endif
1131 }
1132
1133 static void
1134 wakeup_gc_threads (nat n_threads USED_IF_THREADS)
1135 {
1136 #if defined(THREADED_RTS)
1137     nat i;
1138     for (i=1; i < n_threads; i++) {
1139         inc_running();
1140         ACQUIRE_LOCK(&gc_threads[i]->wake_mutex);
1141         gc_threads[i]->wakeup = rtsTrue;
1142         signalCondition(&gc_threads[i]->wake_cond);
1143         RELEASE_LOCK(&gc_threads[i]->wake_mutex);
1144     }
1145 #endif
1146 }
1147
1148 /* ----------------------------------------------------------------------------
1149    Initialise a generation that is to be collected 
1150    ------------------------------------------------------------------------- */
1151
1152 static void
1153 init_collected_gen (nat g, nat n_threads)
1154 {
1155     nat s, t, i;
1156     step_workspace *ws;
1157     step *stp;
1158     bdescr *bd;
1159
1160     // Throw away the current mutable list.  Invariant: the mutable
1161     // list always has at least one block; this means we can avoid a
1162     // check for NULL in recordMutable().
1163     if (g != 0) {
1164         freeChain(generations[g].mut_list);
1165         generations[g].mut_list = allocBlock();
1166         for (i = 0; i < n_capabilities; i++) {
1167             freeChain(capabilities[i].mut_lists[g]);
1168             capabilities[i].mut_lists[g] = allocBlock();
1169         }
1170     }
1171
1172     for (s = 0; s < generations[g].n_steps; s++) {
1173
1174         // generation 0, step 0 doesn't need to-space 
1175         if (g == 0 && s == 0 && RtsFlags.GcFlags.generations > 1) { 
1176             continue; 
1177         }
1178         
1179         stp = &generations[g].steps[s];
1180         ASSERT(stp->gen_no == g);
1181
1182         // deprecate the existing blocks
1183         stp->old_blocks   = stp->blocks;
1184         stp->n_old_blocks = stp->n_blocks;
1185         stp->blocks       = NULL;
1186         stp->n_blocks     = 0;
1187
1188         // we don't have any to-be-scavenged blocks yet
1189         stp->todos = NULL;
1190         stp->n_todos = 0;
1191
1192         // initialise the large object queues.
1193         stp->scavenged_large_objects = NULL;
1194         stp->n_scavenged_large_blocks = 0;
1195
1196         // mark the large objects as not evacuated yet 
1197         for (bd = stp->large_objects; bd; bd = bd->link) {
1198             bd->flags &= ~BF_EVACUATED;
1199         }
1200
1201         // for a compacted step, we need to allocate the bitmap
1202         if (stp->is_compacted) {
1203             nat bitmap_size; // in bytes
1204             bdescr *bitmap_bdescr;
1205             StgWord *bitmap;
1206             
1207             bitmap_size = stp->n_old_blocks * BLOCK_SIZE / (sizeof(W_)*BITS_PER_BYTE);
1208             
1209             if (bitmap_size > 0) {
1210                 bitmap_bdescr = allocGroup((lnat)BLOCK_ROUND_UP(bitmap_size) 
1211                                            / BLOCK_SIZE);
1212                 stp->bitmap = bitmap_bdescr;
1213                 bitmap = bitmap_bdescr->start;
1214                 
1215                 debugTrace(DEBUG_gc, "bitmap_size: %d, bitmap: %p",
1216                            bitmap_size, bitmap);
1217                 
1218                 // don't forget to fill it with zeros!
1219                 memset(bitmap, 0, bitmap_size);
1220                 
1221                 // For each block in this step, point to its bitmap from the
1222                 // block descriptor.
1223                 for (bd=stp->old_blocks; bd != NULL; bd = bd->link) {
1224                     bd->u.bitmap = bitmap;
1225                     bitmap += BLOCK_SIZE_W / (sizeof(W_)*BITS_PER_BYTE);
1226                     
1227                     // Also at this point we set the BF_COMPACTED flag
1228                     // for this block.  The invariant is that
1229                     // BF_COMPACTED is always unset, except during GC
1230                     // when it is set on those blocks which will be
1231                     // compacted.
1232                     bd->flags |= BF_COMPACTED;
1233                 }
1234             }
1235         }
1236     }
1237
1238     // For each GC thread, for each step, allocate a "todo" block to
1239     // store evacuated objects to be scavenged, and a block to store
1240     // evacuated objects that do not need to be scavenged.
1241     for (t = 0; t < n_threads; t++) {
1242         for (s = 0; s < generations[g].n_steps; s++) {
1243
1244             // we don't copy objects into g0s0, unless -G0
1245             if (g==0 && s==0 && RtsFlags.GcFlags.generations > 1) continue;
1246
1247             ws = &gc_threads[t]->steps[g * RtsFlags.GcFlags.steps + s];
1248
1249             ws->scan_bd = NULL;
1250             ws->scan = NULL;
1251
1252             ws->todo_large_objects = NULL;
1253
1254             // allocate the first to-space block; extra blocks will be
1255             // chained on as necessary.
1256             ws->todo_bd = NULL;
1257             ws->buffer_todo_bd = NULL;
1258             gc_alloc_todo_block(ws);
1259
1260             ws->scavd_list = NULL;
1261             ws->n_scavd_blocks = 0;
1262         }
1263     }
1264 }
1265
1266
1267 /* ----------------------------------------------------------------------------
1268    Initialise a generation that is *not* to be collected 
1269    ------------------------------------------------------------------------- */
1270
1271 static void
1272 init_uncollected_gen (nat g, nat threads)
1273 {
1274     nat s, t, i;
1275     step_workspace *ws;
1276     step *stp;
1277     bdescr *bd;
1278
1279     for (s = 0; s < generations[g].n_steps; s++) {
1280         stp = &generations[g].steps[s];
1281         stp->scavenged_large_objects = NULL;
1282         stp->n_scavenged_large_blocks = 0;
1283     }
1284     
1285     for (t = 0; t < threads; t++) {
1286         for (s = 0; s < generations[g].n_steps; s++) {
1287             
1288             ws = &gc_threads[t]->steps[g * RtsFlags.GcFlags.steps + s];
1289             stp = ws->stp;
1290             
1291             ws->buffer_todo_bd = NULL;
1292             ws->todo_large_objects = NULL;
1293
1294             ws->scavd_list = NULL;
1295             ws->n_scavd_blocks = 0;
1296
1297             // If the block at the head of the list in this generation
1298             // is less than 3/4 full, then use it as a todo block.
1299             if (stp->blocks && isPartiallyFull(stp->blocks))
1300             {
1301                 ws->todo_bd = stp->blocks;
1302                 ws->todo_free = ws->todo_bd->free;
1303                 ws->todo_lim = ws->todo_bd->start + BLOCK_SIZE_W;
1304                 stp->blocks = stp->blocks->link;
1305                 stp->n_blocks -= 1;
1306                 ws->todo_bd->link = NULL;
1307
1308                 // this block is also the scan block; we must scan
1309                 // from the current end point.
1310                 ws->scan_bd = ws->todo_bd;
1311                 ws->scan = ws->scan_bd->free;
1312
1313                 // subtract the contents of this block from the stats,
1314                 // because we'll count the whole block later.
1315                 copied -= ws->scan_bd->free - ws->scan_bd->start;
1316             } 
1317             else
1318             {
1319                 ws->scan_bd = NULL;
1320                 ws->scan = NULL;
1321                 ws->todo_bd = NULL;
1322                 gc_alloc_todo_block(ws);
1323             }
1324         }
1325     }
1326
1327     // Move the private mutable lists from each capability onto the
1328     // main mutable list for the generation.
1329     for (i = 0; i < n_capabilities; i++) {
1330         for (bd = capabilities[i].mut_lists[g]; 
1331              bd->link != NULL; bd = bd->link) {
1332             /* nothing */
1333         }
1334         bd->link = generations[g].mut_list;
1335         generations[g].mut_list = capabilities[i].mut_lists[g];
1336         capabilities[i].mut_lists[g] = allocBlock();
1337     }
1338 }
1339
1340 /* -----------------------------------------------------------------------------
1341    Initialise a gc_thread before GC
1342    -------------------------------------------------------------------------- */
1343
1344 static void
1345 init_gc_thread (gc_thread *t)
1346 {
1347     t->evac_step = 0;
1348     t->failed_to_evac = rtsFalse;
1349     t->eager_promotion = rtsTrue;
1350     t->thunk_selector_depth = 0;
1351 }
1352
1353 /* -----------------------------------------------------------------------------
1354    Function we pass to GetRoots to evacuate roots.
1355    -------------------------------------------------------------------------- */
1356
1357 static void
1358 mark_root(StgClosure **root)
1359 {
1360   evacuate(root);
1361 }
1362
1363 /* -----------------------------------------------------------------------------
1364    Initialising the static object & mutable lists
1365    -------------------------------------------------------------------------- */
1366
1367 static void
1368 zero_static_object_list(StgClosure* first_static)
1369 {
1370   StgClosure* p;
1371   StgClosure* link;
1372   const StgInfoTable *info;
1373
1374   for (p = first_static; p != END_OF_STATIC_LIST; p = link) {
1375     info = get_itbl(p);
1376     link = *STATIC_LINK(info, p);
1377     *STATIC_LINK(info,p) = NULL;
1378   }
1379 }
1380
1381 /* -----------------------------------------------------------------------------
1382    Reverting CAFs
1383    -------------------------------------------------------------------------- */
1384
1385 void
1386 revertCAFs( void )
1387 {
1388     StgIndStatic *c;
1389
1390     for (c = (StgIndStatic *)revertible_caf_list; c != NULL; 
1391          c = (StgIndStatic *)c->static_link) 
1392     {
1393         SET_INFO(c, c->saved_info);
1394         c->saved_info = NULL;
1395         // could, but not necessary: c->static_link = NULL; 
1396     }
1397     revertible_caf_list = NULL;
1398 }
1399
1400 void
1401 markCAFs( evac_fn evac )
1402 {
1403     StgIndStatic *c;
1404
1405     for (c = (StgIndStatic *)caf_list; c != NULL; 
1406          c = (StgIndStatic *)c->static_link) 
1407     {
1408         evac(&c->indirectee);
1409     }
1410     for (c = (StgIndStatic *)revertible_caf_list; c != NULL; 
1411          c = (StgIndStatic *)c->static_link) 
1412     {
1413         evac(&c->indirectee);
1414     }
1415 }
1416
1417 /* ----------------------------------------------------------------------------
1418    Update the pointers from the task list
1419
1420    These are treated as weak pointers because we want to allow a main
1421    thread to get a BlockedOnDeadMVar exception in the same way as any
1422    other thread.  Note that the threads should all have been retained
1423    by GC by virtue of being on the all_threads list, we're just
1424    updating pointers here.
1425    ------------------------------------------------------------------------- */
1426
1427 static void
1428 update_task_list (void)
1429 {
1430     Task *task;
1431     StgTSO *tso;
1432     for (task = all_tasks; task != NULL; task = task->all_link) {
1433         if (!task->stopped && task->tso) {
1434             ASSERT(task->tso->bound == task);
1435             tso = (StgTSO *) isAlive((StgClosure *)task->tso);
1436             if (tso == NULL) {
1437                 barf("task %p: main thread %d has been GC'd", 
1438 #ifdef THREADED_RTS
1439                      (void *)task->id, 
1440 #else
1441                      (void *)task,
1442 #endif
1443                      task->tso->id);
1444             }
1445             task->tso = tso;
1446         }
1447     }
1448 }
1449
1450 /* ----------------------------------------------------------------------------
1451    Reset the sizes of the older generations when we do a major
1452    collection.
1453   
1454    CURRENT STRATEGY: make all generations except zero the same size.
1455    We have to stay within the maximum heap size, and leave a certain
1456    percentage of the maximum heap size available to allocate into.
1457    ------------------------------------------------------------------------- */
1458
1459 static void
1460 resize_generations (void)
1461 {
1462     nat g;
1463
1464     if (major_gc && RtsFlags.GcFlags.generations > 1) {
1465         nat live, size, min_alloc;
1466         nat max  = RtsFlags.GcFlags.maxHeapSize;
1467         nat gens = RtsFlags.GcFlags.generations;
1468         
1469         // live in the oldest generations
1470         live = oldest_gen->steps[0].n_blocks +
1471             oldest_gen->steps[0].n_large_blocks;
1472         
1473         // default max size for all generations except zero
1474         size = stg_max(live * RtsFlags.GcFlags.oldGenFactor,
1475                        RtsFlags.GcFlags.minOldGenSize);
1476         
1477         // minimum size for generation zero
1478         min_alloc = stg_max((RtsFlags.GcFlags.pcFreeHeap * max) / 200,
1479                             RtsFlags.GcFlags.minAllocAreaSize);
1480
1481         // Auto-enable compaction when the residency reaches a
1482         // certain percentage of the maximum heap size (default: 30%).
1483         if (RtsFlags.GcFlags.generations > 1 &&
1484             (RtsFlags.GcFlags.compact ||
1485              (max > 0 &&
1486               oldest_gen->steps[0].n_blocks > 
1487               (RtsFlags.GcFlags.compactThreshold * max) / 100))) {
1488             oldest_gen->steps[0].is_compacted = 1;
1489 //        debugBelch("compaction: on\n", live);
1490         } else {
1491             oldest_gen->steps[0].is_compacted = 0;
1492 //        debugBelch("compaction: off\n", live);
1493         }
1494
1495         // if we're going to go over the maximum heap size, reduce the
1496         // size of the generations accordingly.  The calculation is
1497         // different if compaction is turned on, because we don't need
1498         // to double the space required to collect the old generation.
1499         if (max != 0) {
1500             
1501             // this test is necessary to ensure that the calculations
1502             // below don't have any negative results - we're working
1503             // with unsigned values here.
1504             if (max < min_alloc) {
1505                 heapOverflow();
1506             }
1507             
1508             if (oldest_gen->steps[0].is_compacted) {
1509                 if ( (size + (size - 1) * (gens - 2) * 2) + min_alloc > max ) {
1510                     size = (max - min_alloc) / ((gens - 1) * 2 - 1);
1511                 }
1512             } else {
1513                 if ( (size * (gens - 1) * 2) + min_alloc > max ) {
1514                     size = (max - min_alloc) / ((gens - 1) * 2);
1515                 }
1516             }
1517             
1518             if (size < live) {
1519                 heapOverflow();
1520             }
1521         }
1522         
1523 #if 0
1524         debugBelch("live: %d, min_alloc: %d, size : %d, max = %d\n", live,
1525                    min_alloc, size, max);
1526 #endif
1527         
1528         for (g = 0; g < gens; g++) {
1529             generations[g].max_blocks = size;
1530         }
1531     }
1532 }
1533
1534 /* -----------------------------------------------------------------------------
1535    Calculate the new size of the nursery, and resize it.
1536    -------------------------------------------------------------------------- */
1537
1538 static void
1539 resize_nursery (void)
1540 {
1541     if (RtsFlags.GcFlags.generations == 1)
1542     {   // Two-space collector:
1543         nat blocks;
1544     
1545         /* set up a new nursery.  Allocate a nursery size based on a
1546          * function of the amount of live data (by default a factor of 2)
1547          * Use the blocks from the old nursery if possible, freeing up any
1548          * left over blocks.
1549          *
1550          * If we get near the maximum heap size, then adjust our nursery
1551          * size accordingly.  If the nursery is the same size as the live
1552          * data (L), then we need 3L bytes.  We can reduce the size of the
1553          * nursery to bring the required memory down near 2L bytes.
1554          * 
1555          * A normal 2-space collector would need 4L bytes to give the same
1556          * performance we get from 3L bytes, reducing to the same
1557          * performance at 2L bytes.
1558          */
1559         blocks = g0s0->n_old_blocks;
1560         
1561         if ( RtsFlags.GcFlags.maxHeapSize != 0 &&
1562              blocks * RtsFlags.GcFlags.oldGenFactor * 2 > 
1563              RtsFlags.GcFlags.maxHeapSize )
1564         {
1565             long adjusted_blocks;  // signed on purpose 
1566             int pc_free; 
1567             
1568             adjusted_blocks = (RtsFlags.GcFlags.maxHeapSize - 2 * blocks);
1569             
1570             debugTrace(DEBUG_gc, "near maximum heap size of 0x%x blocks, blocks = %d, adjusted to %ld", 
1571                        RtsFlags.GcFlags.maxHeapSize, blocks, adjusted_blocks);
1572             
1573             pc_free = adjusted_blocks * 100 / RtsFlags.GcFlags.maxHeapSize;
1574             if (pc_free < RtsFlags.GcFlags.pcFreeHeap) /* might even * be < 0 */
1575             {
1576                 heapOverflow();
1577             }
1578             blocks = adjusted_blocks;
1579         }
1580         else
1581         {
1582             blocks *= RtsFlags.GcFlags.oldGenFactor;
1583             if (blocks < RtsFlags.GcFlags.minAllocAreaSize)
1584             {
1585                 blocks = RtsFlags.GcFlags.minAllocAreaSize;
1586             }
1587         }
1588         resizeNurseries(blocks);
1589     }
1590     else  // Generational collector
1591     {
1592         /* 
1593          * If the user has given us a suggested heap size, adjust our
1594          * allocation area to make best use of the memory available.
1595          */
1596         if (RtsFlags.GcFlags.heapSizeSuggestion)
1597         {
1598             long blocks;
1599             nat needed = calcNeeded();  // approx blocks needed at next GC 
1600             
1601             /* Guess how much will be live in generation 0 step 0 next time.
1602              * A good approximation is obtained by finding the
1603              * percentage of g0s0 that was live at the last minor GC.
1604              *
1605              * We have an accurate figure for the amount of copied data in
1606              * 'copied', but we must convert this to a number of blocks, with
1607              * a small adjustment for estimated slop at the end of a block
1608              * (- 10 words).
1609              */
1610             if (N == 0)
1611             {
1612                 g0s0_pcnt_kept = ((copied / (BLOCK_SIZE_W - 10)) * 100)
1613                     / countNurseryBlocks();
1614             }
1615             
1616             /* Estimate a size for the allocation area based on the
1617              * information available.  We might end up going slightly under
1618              * or over the suggested heap size, but we should be pretty
1619              * close on average.
1620              *
1621              * Formula:            suggested - needed
1622              *                ----------------------------
1623              *                    1 + g0s0_pcnt_kept/100
1624              *
1625              * where 'needed' is the amount of memory needed at the next
1626              * collection for collecting all steps except g0s0.
1627              */
1628             blocks = 
1629                 (((long)RtsFlags.GcFlags.heapSizeSuggestion - (long)needed) * 100) /
1630                 (100 + (long)g0s0_pcnt_kept);
1631             
1632             if (blocks < (long)RtsFlags.GcFlags.minAllocAreaSize) {
1633                 blocks = RtsFlags.GcFlags.minAllocAreaSize;
1634             }
1635             
1636             resizeNurseries((nat)blocks);
1637         }
1638         else
1639         {
1640             // we might have added extra large blocks to the nursery, so
1641             // resize back to minAllocAreaSize again.
1642             resizeNurseriesFixed(RtsFlags.GcFlags.minAllocAreaSize);
1643         }
1644     }
1645 }
1646
1647 /* -----------------------------------------------------------------------------
1648    Sanity code for CAF garbage collection.
1649
1650    With DEBUG turned on, we manage a CAF list in addition to the SRT
1651    mechanism.  After GC, we run down the CAF list and blackhole any
1652    CAFs which have been garbage collected.  This means we get an error
1653    whenever the program tries to enter a garbage collected CAF.
1654
1655    Any garbage collected CAFs are taken off the CAF list at the same
1656    time. 
1657    -------------------------------------------------------------------------- */
1658
1659 #if 0 && defined(DEBUG)
1660
1661 static void
1662 gcCAFs(void)
1663 {
1664   StgClosure*  p;
1665   StgClosure** pp;
1666   const StgInfoTable *info;
1667   nat i;
1668
1669   i = 0;
1670   p = caf_list;
1671   pp = &caf_list;
1672
1673   while (p != NULL) {
1674     
1675     info = get_itbl(p);
1676
1677     ASSERT(info->type == IND_STATIC);
1678
1679     if (STATIC_LINK(info,p) == NULL) {
1680         debugTrace(DEBUG_gccafs, "CAF gc'd at 0x%04lx", (long)p);
1681         // black hole it 
1682         SET_INFO(p,&stg_BLACKHOLE_info);
1683         p = STATIC_LINK2(info,p);
1684         *pp = p;
1685     }
1686     else {
1687       pp = &STATIC_LINK2(info,p);
1688       p = *pp;
1689       i++;
1690     }
1691
1692   }
1693
1694   debugTrace(DEBUG_gccafs, "%d CAFs live", i); 
1695 }
1696 #endif