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