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