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