remove old comment
[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 void
699 GetRoots( evac_fn evac )
700 {
701     nat i;
702     Capability *cap;
703     Task *task;
704
705     for (i = 0; i < n_capabilities; i++) {
706         cap = &capabilities[i];
707         evac((StgClosure **)(void *)&cap->run_queue_hd);
708         evac((StgClosure **)(void *)&cap->run_queue_tl);
709 #if defined(THREADED_RTS)
710         evac((StgClosure **)(void *)&cap->wakeup_queue_hd);
711         evac((StgClosure **)(void *)&cap->wakeup_queue_tl);
712 #endif
713         for (task = cap->suspended_ccalling_tasks; task != NULL; 
714              task=task->next) {
715             debugTrace(DEBUG_sched,
716                        "evac'ing suspended TSO %lu", (unsigned long)task->suspended_tso->id);
717             evac((StgClosure **)(void *)&task->suspended_tso);
718         }
719
720     }
721     
722 #if !defined(THREADED_RTS)
723     evac((StgClosure **)(void *)&blocked_queue_hd);
724     evac((StgClosure **)(void *)&blocked_queue_tl);
725     evac((StgClosure **)(void *)&sleeping_queue);
726 #endif 
727
728     // evac((StgClosure **)&blackhole_queue);
729
730 #if defined(THREADED_RTS)
731     markSparkQueue(evac);
732 #endif
733     
734 #if defined(RTS_USER_SIGNALS)
735     // mark the signal handlers (signals should be already blocked)
736     markSignalHandlers(evac);
737 #endif
738 }
739
740 /* -----------------------------------------------------------------------------
741    isAlive determines whether the given closure is still alive (after
742    a garbage collection) or not.  It returns the new address of the
743    closure if it is alive, or NULL otherwise.
744
745    NOTE: Use it before compaction only!
746          It untags and (if needed) retags pointers to closures.
747    -------------------------------------------------------------------------- */
748
749
750 StgClosure *
751 isAlive(StgClosure *p)
752 {
753   const StgInfoTable *info;
754   bdescr *bd;
755   StgWord tag;
756   StgClosure *q;
757
758   while (1) {
759     /* The tag and the pointer are split, to be merged later when needed. */
760     tag = GET_CLOSURE_TAG(p);
761     q = UNTAG_CLOSURE(p);
762
763     ASSERT(LOOKS_LIKE_CLOSURE_PTR(q));
764     info = get_itbl(q);
765
766     // ignore static closures 
767     //
768     // ToDo: for static closures, check the static link field.
769     // Problem here is that we sometimes don't set the link field, eg.
770     // for static closures with an empty SRT or CONSTR_STATIC_NOCAFs.
771     //
772     if (!HEAP_ALLOCED(q)) {
773         return p;
774     }
775
776     // ignore closures in generations that we're not collecting. 
777     bd = Bdescr((P_)q);
778     if (bd->gen_no > N) {
779         return p;
780     }
781
782     // if it's a pointer into to-space, then we're done
783     if (bd->flags & BF_EVACUATED) {
784         return p;
785     }
786
787     // large objects use the evacuated flag
788     if (bd->flags & BF_LARGE) {
789         return NULL;
790     }
791
792     // check the mark bit for compacted steps
793     if ((bd->flags & BF_COMPACTED) && is_marked((P_)q,bd)) {
794         return p;
795     }
796
797     switch (info->type) {
798
799     case IND:
800     case IND_STATIC:
801     case IND_PERM:
802     case IND_OLDGEN:            // rely on compatible layout with StgInd 
803     case IND_OLDGEN_PERM:
804       // follow indirections 
805       p = ((StgInd *)q)->indirectee;
806       continue;
807
808     case EVACUATED:
809       // alive! 
810       return ((StgEvacuated *)q)->evacuee;
811
812     case TSO:
813       if (((StgTSO *)q)->what_next == ThreadRelocated) {
814         p = (StgClosure *)((StgTSO *)q)->link;
815         continue;
816       } 
817       return NULL;
818
819     default:
820       // dead. 
821       return NULL;
822     }
823   }
824 }
825
826 /* -----------------------------------------------------------------------------
827    Figure out which generation to collect, initialise N and major_gc.
828    -------------------------------------------------------------------------- */
829
830 static void
831 initialise_N (rtsBool force_major_gc)
832 {
833     nat g;
834
835     if (force_major_gc) {
836         N = RtsFlags.GcFlags.generations - 1;
837         major_gc = rtsTrue;
838     } else {
839         N = 0;
840         for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
841             if (generations[g].steps[0].n_blocks +
842                 generations[g].steps[0].n_large_blocks
843                 >= generations[g].max_blocks) {
844                 N = g;
845             }
846         }
847         major_gc = (N == RtsFlags.GcFlags.generations-1);
848     }
849 }
850
851 /* -----------------------------------------------------------------------------
852    Initialise the gc_thread structures.
853    -------------------------------------------------------------------------- */
854
855 static void
856 alloc_gc_thread (gc_thread *t, int n)
857 {
858     nat g, s;
859     step_workspace *ws;
860
861 #ifdef THREADED_RTS
862     t->id = 0;
863     initCondition(&t->wake_cond);
864     initMutex(&t->wake_mutex);
865     t->wakeup = rtsFalse;
866     t->exit   = rtsFalse;
867 #endif
868
869     t->thread_index = n;
870     t->free_blocks = NULL;
871     t->gc_count = 0;
872
873     init_gc_thread(t);
874     
875 #ifdef USE_PAPI
876     t->papi_events = -1;
877 #endif
878
879     t->steps = stgMallocBytes(RtsFlags.GcFlags.generations * 
880                                 sizeof(step_workspace *), 
881                                 "initialise_gc_thread");
882
883     for (g = 0; g < RtsFlags.GcFlags.generations; g++)
884     {
885         t->steps[g] = stgMallocBytes(generations[g].n_steps * 
886                                        sizeof(step_workspace),
887                                        "initialise_gc_thread/2");
888
889         for (s = 0; s < generations[g].n_steps; s++)
890         {
891             ws = &t->steps[g][s];
892             ws->stp = &generations[g].steps[s];
893             ws->gct = t;
894
895             ws->scan_bd = NULL;
896             ws->scan = NULL;
897
898             ws->todo_bd = NULL;
899             ws->buffer_todo_bd = NULL;
900
901             ws->scavd_list = NULL;
902             ws->n_scavd_blocks = 0;
903         }
904     }
905 }
906
907
908 static void
909 alloc_gc_threads (void)
910 {
911     if (gc_threads == NULL) {
912 #if defined(THREADED_RTS)
913         nat i;
914         gc_threads = stgMallocBytes (RtsFlags.ParFlags.gcThreads * 
915                                      sizeof(gc_thread), 
916                                      "alloc_gc_threads");
917
918         for (i = 0; i < RtsFlags.ParFlags.gcThreads; i++) {
919             alloc_gc_thread(&gc_threads[i], i);
920         }
921 #else
922         gc_threads = stgMallocBytes (sizeof(gc_thread), 
923                                      "alloc_gc_threads");
924
925         alloc_gc_thread(gc_threads, 0);
926 #endif
927     }
928 }
929
930 /* ----------------------------------------------------------------------------
931    Start GC threads
932    ------------------------------------------------------------------------- */
933
934 static nat gc_running_threads;
935
936 #if defined(THREADED_RTS)
937 static Mutex gc_running_mutex;
938 #endif
939
940 static nat
941 inc_running (void)
942 {
943     nat n_running;
944     ACQUIRE_LOCK(&gc_running_mutex);
945     n_running = ++gc_running_threads;
946     RELEASE_LOCK(&gc_running_mutex);
947     return n_running;
948 }
949
950 static nat
951 dec_running (void)
952 {
953     nat n_running;
954     ACQUIRE_LOCK(&gc_running_mutex);
955     n_running = --gc_running_threads;
956     RELEASE_LOCK(&gc_running_mutex);
957     return n_running;
958 }
959
960 //
961 // gc_thread_work(): Scavenge until there's no work left to do and all
962 // the running threads are idle.
963 //
964 static void
965 gc_thread_work (void)
966 {
967     nat r;
968         
969     debugTrace(DEBUG_gc, "GC thread %d working", gct->thread_index);
970
971     // gc_running_threads has already been incremented for us; either
972     // this is the main thread and we incremented it inside
973     // GarbageCollect(), or this is a worker thread and the main
974     // thread bumped gc_running_threads before waking us up.
975
976 loop:
977     scavenge_loop();
978     // scavenge_loop() only exits when there's no work to do
979     r = dec_running();
980     
981     debugTrace(DEBUG_gc, "GC thread %d idle (%d still running)", 
982                gct->thread_index, r);
983
984     while (gc_running_threads != 0) {
985         if (any_work()) {
986             inc_running();
987             goto loop;
988         }
989         // any_work() does not remove the work from the queue, it
990         // just checks for the presence of work.  If we find any,
991         // then we increment gc_running_threads and go back to 
992         // scavenge_loop() to perform any pending work.
993     }
994     
995     // All threads are now stopped
996     debugTrace(DEBUG_gc, "GC thread %d finished.", gct->thread_index);
997 }
998
999
1000 #if defined(THREADED_RTS)
1001 static void
1002 gc_thread_mainloop (void)
1003 {
1004     while (!gct->exit) {
1005
1006         // Wait until we're told to wake up
1007         ACQUIRE_LOCK(&gct->wake_mutex);
1008         while (!gct->wakeup) {
1009             debugTrace(DEBUG_gc, "GC thread %d standing by...", 
1010                        gct->thread_index);
1011             waitCondition(&gct->wake_cond, &gct->wake_mutex);
1012         }
1013         RELEASE_LOCK(&gct->wake_mutex);
1014         gct->wakeup = rtsFalse;
1015         if (gct->exit) break;
1016
1017 #ifdef USE_PAPI
1018         // start performance counters in this thread...
1019         if (gct->papi_events == -1) {
1020             papi_init_eventset(&gct->papi_events);
1021         }
1022         papi_thread_start_gc1_count(gct->papi_events);
1023 #endif
1024
1025         gc_thread_work();
1026
1027 #ifdef USE_PAPI
1028         // count events in this thread towards the GC totals
1029         papi_thread_stop_gc1_count(gct->papi_events);
1030 #endif
1031     }
1032 }       
1033 #endif
1034
1035 #if defined(THREADED_RTS)
1036 static void
1037 gc_thread_entry (gc_thread *my_gct)
1038 {
1039     gct = my_gct;
1040     debugTrace(DEBUG_gc, "GC thread %d starting...", gct->thread_index);
1041     gct->id = osThreadId();
1042     gc_thread_mainloop();
1043 }
1044 #endif
1045
1046 static void
1047 start_gc_threads (void)
1048 {
1049 #if defined(THREADED_RTS)
1050     nat i;
1051     OSThreadId id;
1052     static rtsBool done = rtsFalse;
1053
1054     gc_running_threads = 0;
1055     initMutex(&gc_running_mutex);
1056
1057     if (!done) {
1058         // Start from 1: the main thread is 0
1059         for (i = 1; i < RtsFlags.ParFlags.gcThreads; i++) {
1060             createOSThread(&id, (OSThreadProc*)&gc_thread_entry, 
1061                            &gc_threads[i]);
1062         }
1063         done = rtsTrue;
1064     }
1065 #endif
1066 }
1067
1068 static void
1069 wakeup_gc_threads (nat n_threads USED_IF_THREADS)
1070 {
1071 #if defined(THREADED_RTS)
1072     nat i;
1073     for (i=1; i < n_threads; i++) {
1074         inc_running();
1075         ACQUIRE_LOCK(&gc_threads[i].wake_mutex);
1076         gc_threads[i].wakeup = rtsTrue;
1077         signalCondition(&gc_threads[i].wake_cond);
1078         RELEASE_LOCK(&gc_threads[i].wake_mutex);
1079     }
1080 #endif
1081 }
1082
1083 /* ----------------------------------------------------------------------------
1084    Initialise a generation that is to be collected 
1085    ------------------------------------------------------------------------- */
1086
1087 static void
1088 init_collected_gen (nat g, nat n_threads)
1089 {
1090     nat s, t, i;
1091     step_workspace *ws;
1092     step *stp;
1093     bdescr *bd;
1094
1095     // Throw away the current mutable list.  Invariant: the mutable
1096     // list always has at least one block; this means we can avoid a
1097     // check for NULL in recordMutable().
1098     if (g != 0) {
1099         freeChain(generations[g].mut_list);
1100         generations[g].mut_list = allocBlock();
1101         for (i = 0; i < n_capabilities; i++) {
1102             freeChain(capabilities[i].mut_lists[g]);
1103             capabilities[i].mut_lists[g] = allocBlock();
1104         }
1105     }
1106
1107     for (s = 0; s < generations[g].n_steps; s++) {
1108
1109         // generation 0, step 0 doesn't need to-space 
1110         if (g == 0 && s == 0 && RtsFlags.GcFlags.generations > 1) { 
1111             continue; 
1112         }
1113         
1114         stp = &generations[g].steps[s];
1115         ASSERT(stp->gen_no == g);
1116
1117         // deprecate the existing blocks
1118         stp->old_blocks   = stp->blocks;
1119         stp->n_old_blocks = stp->n_blocks;
1120         stp->blocks       = NULL;
1121         stp->n_blocks     = 0;
1122
1123         // we don't have any to-be-scavenged blocks yet
1124         stp->todos = NULL;
1125         stp->n_todos = 0;
1126
1127         // initialise the large object queues.
1128         stp->scavenged_large_objects = NULL;
1129         stp->n_scavenged_large_blocks = 0;
1130
1131         // mark the large objects as not evacuated yet 
1132         for (bd = stp->large_objects; bd; bd = bd->link) {
1133             bd->flags &= ~BF_EVACUATED;
1134         }
1135
1136         // for a compacted step, we need to allocate the bitmap
1137         if (stp->is_compacted) {
1138             nat bitmap_size; // in bytes
1139             bdescr *bitmap_bdescr;
1140             StgWord *bitmap;
1141             
1142             bitmap_size = stp->n_old_blocks * BLOCK_SIZE / (sizeof(W_)*BITS_PER_BYTE);
1143             
1144             if (bitmap_size > 0) {
1145                 bitmap_bdescr = allocGroup((lnat)BLOCK_ROUND_UP(bitmap_size) 
1146                                            / BLOCK_SIZE);
1147                 stp->bitmap = bitmap_bdescr;
1148                 bitmap = bitmap_bdescr->start;
1149                 
1150                 debugTrace(DEBUG_gc, "bitmap_size: %d, bitmap: %p",
1151                            bitmap_size, bitmap);
1152                 
1153                 // don't forget to fill it with zeros!
1154                 memset(bitmap, 0, bitmap_size);
1155                 
1156                 // For each block in this step, point to its bitmap from the
1157                 // block descriptor.
1158                 for (bd=stp->old_blocks; bd != NULL; bd = bd->link) {
1159                     bd->u.bitmap = bitmap;
1160                     bitmap += BLOCK_SIZE_W / (sizeof(W_)*BITS_PER_BYTE);
1161                     
1162                     // Also at this point we set the BF_COMPACTED flag
1163                     // for this block.  The invariant is that
1164                     // BF_COMPACTED is always unset, except during GC
1165                     // when it is set on those blocks which will be
1166                     // compacted.
1167                     bd->flags |= BF_COMPACTED;
1168                 }
1169             }
1170         }
1171     }
1172
1173     // For each GC thread, for each step, allocate a "todo" block to
1174     // store evacuated objects to be scavenged, and a block to store
1175     // evacuated objects that do not need to be scavenged.
1176     for (t = 0; t < n_threads; t++) {
1177         for (s = 0; s < generations[g].n_steps; s++) {
1178
1179             // we don't copy objects into g0s0, unless -G0
1180             if (g==0 && s==0 && RtsFlags.GcFlags.generations > 1) continue;
1181
1182             ws = &gc_threads[t].steps[g][s];
1183
1184             ws->scan_bd = NULL;
1185             ws->scan = NULL;
1186
1187             ws->todo_large_objects = NULL;
1188
1189             // allocate the first to-space block; extra blocks will be
1190             // chained on as necessary.
1191             ws->todo_bd = NULL;
1192             ws->buffer_todo_bd = NULL;
1193             gc_alloc_todo_block(ws);
1194
1195             ws->scavd_list = NULL;
1196             ws->n_scavd_blocks = 0;
1197         }
1198     }
1199 }
1200
1201
1202 /* ----------------------------------------------------------------------------
1203    Initialise a generation that is *not* to be collected 
1204    ------------------------------------------------------------------------- */
1205
1206 static void
1207 init_uncollected_gen (nat g, nat threads)
1208 {
1209     nat s, t, i;
1210     step_workspace *ws;
1211     step *stp;
1212     bdescr *bd;
1213
1214     for (s = 0; s < generations[g].n_steps; s++) {
1215         stp = &generations[g].steps[s];
1216         stp->scavenged_large_objects = NULL;
1217         stp->n_scavenged_large_blocks = 0;
1218     }
1219     
1220     for (t = 0; t < threads; t++) {
1221         for (s = 0; s < generations[g].n_steps; s++) {
1222             
1223             ws = &gc_threads[t].steps[g][s];
1224             stp = ws->stp;
1225             
1226             ws->buffer_todo_bd = NULL;
1227             ws->todo_large_objects = NULL;
1228
1229             ws->scavd_list = NULL;
1230             ws->n_scavd_blocks = 0;
1231
1232             // If the block at the head of the list in this generation
1233             // is less than 3/4 full, then use it as a todo block.
1234             if (isPartiallyFull(stp->blocks))
1235             {
1236                 ws->todo_bd = stp->blocks;
1237                 ws->todo_free = ws->todo_bd->free;
1238                 ws->todo_lim = ws->todo_bd->start + BLOCK_SIZE_W;
1239                 stp->blocks = stp->blocks->link;
1240                 stp->n_blocks -= 1;
1241                 ws->todo_bd->link = NULL;
1242
1243                 // this block is also the scan block; we must scan
1244                 // from the current end point.
1245                 ws->scan_bd = ws->todo_bd;
1246                 ws->scan = ws->scan_bd->free;
1247
1248                 // subtract the contents of this block from the stats,
1249                 // because we'll count the whole block later.
1250                 copied -= ws->scan_bd->free - ws->scan_bd->start;
1251             } 
1252             else
1253             {
1254                 ws->scan_bd = NULL;
1255                 ws->scan = NULL;
1256                 ws->todo_bd = NULL;
1257                 gc_alloc_todo_block(ws);
1258             }
1259         }
1260     }
1261
1262     // Move the private mutable lists from each capability onto the
1263     // main mutable list for the generation.
1264     for (i = 0; i < n_capabilities; i++) {
1265         for (bd = capabilities[i].mut_lists[g]; 
1266              bd->link != NULL; bd = bd->link) {
1267             /* nothing */
1268         }
1269         bd->link = generations[g].mut_list;
1270         generations[g].mut_list = capabilities[i].mut_lists[g];
1271         capabilities[i].mut_lists[g] = allocBlock();
1272     }
1273 }
1274
1275 /* -----------------------------------------------------------------------------
1276    Initialise a gc_thread before GC
1277    -------------------------------------------------------------------------- */
1278
1279 static void
1280 init_gc_thread (gc_thread *t)
1281 {
1282     t->evac_step = 0;
1283     t->failed_to_evac = rtsFalse;
1284     t->eager_promotion = rtsTrue;
1285     t->thunk_selector_depth = 0;
1286 }
1287
1288 /* -----------------------------------------------------------------------------
1289    Function we pass to GetRoots to evacuate roots.
1290    -------------------------------------------------------------------------- */
1291
1292 static void
1293 mark_root(StgClosure **root)
1294 {
1295   evacuate(root);
1296 }
1297
1298 /* -----------------------------------------------------------------------------
1299    Initialising the static object & mutable lists
1300    -------------------------------------------------------------------------- */
1301
1302 static void
1303 zero_static_object_list(StgClosure* first_static)
1304 {
1305   StgClosure* p;
1306   StgClosure* link;
1307   const StgInfoTable *info;
1308
1309   for (p = first_static; p != END_OF_STATIC_LIST; p = link) {
1310     info = get_itbl(p);
1311     link = *STATIC_LINK(info, p);
1312     *STATIC_LINK(info,p) = NULL;
1313   }
1314 }
1315
1316 /* -----------------------------------------------------------------------------
1317    Reverting CAFs
1318    -------------------------------------------------------------------------- */
1319
1320 void
1321 revertCAFs( void )
1322 {
1323     StgIndStatic *c;
1324
1325     for (c = (StgIndStatic *)revertible_caf_list; c != NULL; 
1326          c = (StgIndStatic *)c->static_link) 
1327     {
1328         SET_INFO(c, c->saved_info);
1329         c->saved_info = NULL;
1330         // could, but not necessary: c->static_link = NULL; 
1331     }
1332     revertible_caf_list = NULL;
1333 }
1334
1335 void
1336 markCAFs( evac_fn evac )
1337 {
1338     StgIndStatic *c;
1339
1340     for (c = (StgIndStatic *)caf_list; c != NULL; 
1341          c = (StgIndStatic *)c->static_link) 
1342     {
1343         evac(&c->indirectee);
1344     }
1345     for (c = (StgIndStatic *)revertible_caf_list; c != NULL; 
1346          c = (StgIndStatic *)c->static_link) 
1347     {
1348         evac(&c->indirectee);
1349     }
1350 }
1351
1352 /* ----------------------------------------------------------------------------
1353    Update the pointers from the task list
1354
1355    These are treated as weak pointers because we want to allow a main
1356    thread to get a BlockedOnDeadMVar exception in the same way as any
1357    other thread.  Note that the threads should all have been retained
1358    by GC by virtue of being on the all_threads list, we're just
1359    updating pointers here.
1360    ------------------------------------------------------------------------- */
1361
1362 static void
1363 update_task_list (void)
1364 {
1365     Task *task;
1366     StgTSO *tso;
1367     for (task = all_tasks; task != NULL; task = task->all_link) {
1368         if (!task->stopped && task->tso) {
1369             ASSERT(task->tso->bound == task);
1370             tso = (StgTSO *) isAlive((StgClosure *)task->tso);
1371             if (tso == NULL) {
1372                 barf("task %p: main thread %d has been GC'd", 
1373 #ifdef THREADED_RTS
1374                      (void *)task->id, 
1375 #else
1376                      (void *)task,
1377 #endif
1378                      task->tso->id);
1379             }
1380             task->tso = tso;
1381         }
1382     }
1383 }
1384
1385 /* ----------------------------------------------------------------------------
1386    Reset the sizes of the older generations when we do a major
1387    collection.
1388   
1389    CURRENT STRATEGY: make all generations except zero the same size.
1390    We have to stay within the maximum heap size, and leave a certain
1391    percentage of the maximum heap size available to allocate into.
1392    ------------------------------------------------------------------------- */
1393
1394 static void
1395 resize_generations (void)
1396 {
1397     nat g;
1398
1399     if (major_gc && RtsFlags.GcFlags.generations > 1) {
1400         nat live, size, min_alloc;
1401         nat max  = RtsFlags.GcFlags.maxHeapSize;
1402         nat gens = RtsFlags.GcFlags.generations;
1403         
1404         // live in the oldest generations
1405         live = oldest_gen->steps[0].n_blocks +
1406             oldest_gen->steps[0].n_large_blocks;
1407         
1408         // default max size for all generations except zero
1409         size = stg_max(live * RtsFlags.GcFlags.oldGenFactor,
1410                        RtsFlags.GcFlags.minOldGenSize);
1411         
1412         // minimum size for generation zero
1413         min_alloc = stg_max((RtsFlags.GcFlags.pcFreeHeap * max) / 200,
1414                             RtsFlags.GcFlags.minAllocAreaSize);
1415
1416         // Auto-enable compaction when the residency reaches a
1417         // certain percentage of the maximum heap size (default: 30%).
1418         if (RtsFlags.GcFlags.generations > 1 &&
1419             (RtsFlags.GcFlags.compact ||
1420              (max > 0 &&
1421               oldest_gen->steps[0].n_blocks > 
1422               (RtsFlags.GcFlags.compactThreshold * max) / 100))) {
1423             oldest_gen->steps[0].is_compacted = 1;
1424 //        debugBelch("compaction: on\n", live);
1425         } else {
1426             oldest_gen->steps[0].is_compacted = 0;
1427 //        debugBelch("compaction: off\n", live);
1428         }
1429
1430         // if we're going to go over the maximum heap size, reduce the
1431         // size of the generations accordingly.  The calculation is
1432         // different if compaction is turned on, because we don't need
1433         // to double the space required to collect the old generation.
1434         if (max != 0) {
1435             
1436             // this test is necessary to ensure that the calculations
1437             // below don't have any negative results - we're working
1438             // with unsigned values here.
1439             if (max < min_alloc) {
1440                 heapOverflow();
1441             }
1442             
1443             if (oldest_gen->steps[0].is_compacted) {
1444                 if ( (size + (size - 1) * (gens - 2) * 2) + min_alloc > max ) {
1445                     size = (max - min_alloc) / ((gens - 1) * 2 - 1);
1446                 }
1447             } else {
1448                 if ( (size * (gens - 1) * 2) + min_alloc > max ) {
1449                     size = (max - min_alloc) / ((gens - 1) * 2);
1450                 }
1451             }
1452             
1453             if (size < live) {
1454                 heapOverflow();
1455             }
1456         }
1457         
1458 #if 0
1459         debugBelch("live: %d, min_alloc: %d, size : %d, max = %d\n", live,
1460                    min_alloc, size, max);
1461 #endif
1462         
1463         for (g = 0; g < gens; g++) {
1464             generations[g].max_blocks = size;
1465         }
1466     }
1467 }
1468
1469 /* -----------------------------------------------------------------------------
1470    Calculate the new size of the nursery, and resize it.
1471    -------------------------------------------------------------------------- */
1472
1473 static void
1474 resize_nursery (void)
1475 {
1476     if (RtsFlags.GcFlags.generations == 1)
1477     {   // Two-space collector:
1478         nat blocks;
1479     
1480         /* set up a new nursery.  Allocate a nursery size based on a
1481          * function of the amount of live data (by default a factor of 2)
1482          * Use the blocks from the old nursery if possible, freeing up any
1483          * left over blocks.
1484          *
1485          * If we get near the maximum heap size, then adjust our nursery
1486          * size accordingly.  If the nursery is the same size as the live
1487          * data (L), then we need 3L bytes.  We can reduce the size of the
1488          * nursery to bring the required memory down near 2L bytes.
1489          * 
1490          * A normal 2-space collector would need 4L bytes to give the same
1491          * performance we get from 3L bytes, reducing to the same
1492          * performance at 2L bytes.
1493          */
1494         blocks = g0s0->n_old_blocks;
1495         
1496         if ( RtsFlags.GcFlags.maxHeapSize != 0 &&
1497              blocks * RtsFlags.GcFlags.oldGenFactor * 2 > 
1498              RtsFlags.GcFlags.maxHeapSize )
1499         {
1500             long adjusted_blocks;  // signed on purpose 
1501             int pc_free; 
1502             
1503             adjusted_blocks = (RtsFlags.GcFlags.maxHeapSize - 2 * blocks);
1504             
1505             debugTrace(DEBUG_gc, "near maximum heap size of 0x%x blocks, blocks = %d, adjusted to %ld", 
1506                        RtsFlags.GcFlags.maxHeapSize, blocks, adjusted_blocks);
1507             
1508             pc_free = adjusted_blocks * 100 / RtsFlags.GcFlags.maxHeapSize;
1509             if (pc_free < RtsFlags.GcFlags.pcFreeHeap) /* might even * be < 0 */
1510             {
1511                 heapOverflow();
1512             }
1513             blocks = adjusted_blocks;
1514         }
1515         else
1516         {
1517             blocks *= RtsFlags.GcFlags.oldGenFactor;
1518             if (blocks < RtsFlags.GcFlags.minAllocAreaSize)
1519             {
1520                 blocks = RtsFlags.GcFlags.minAllocAreaSize;
1521             }
1522         }
1523         resizeNurseries(blocks);
1524     }
1525     else  // Generational collector
1526     {
1527         /* 
1528          * If the user has given us a suggested heap size, adjust our
1529          * allocation area to make best use of the memory available.
1530          */
1531         if (RtsFlags.GcFlags.heapSizeSuggestion)
1532         {
1533             long blocks;
1534             nat needed = calcNeeded();  // approx blocks needed at next GC 
1535             
1536             /* Guess how much will be live in generation 0 step 0 next time.
1537              * A good approximation is obtained by finding the
1538              * percentage of g0s0 that was live at the last minor GC.
1539              *
1540              * We have an accurate figure for the amount of copied data in
1541              * 'copied', but we must convert this to a number of blocks, with
1542              * a small adjustment for estimated slop at the end of a block
1543              * (- 10 words).
1544              */
1545             if (N == 0)
1546             {
1547                 g0s0_pcnt_kept = ((copied / (BLOCK_SIZE_W - 10)) * 100)
1548                     / countNurseryBlocks();
1549             }
1550             
1551             /* Estimate a size for the allocation area based on the
1552              * information available.  We might end up going slightly under
1553              * or over the suggested heap size, but we should be pretty
1554              * close on average.
1555              *
1556              * Formula:            suggested - needed
1557              *                ----------------------------
1558              *                    1 + g0s0_pcnt_kept/100
1559              *
1560              * where 'needed' is the amount of memory needed at the next
1561              * collection for collecting all steps except g0s0.
1562              */
1563             blocks = 
1564                 (((long)RtsFlags.GcFlags.heapSizeSuggestion - (long)needed) * 100) /
1565                 (100 + (long)g0s0_pcnt_kept);
1566             
1567             if (blocks < (long)RtsFlags.GcFlags.minAllocAreaSize) {
1568                 blocks = RtsFlags.GcFlags.minAllocAreaSize;
1569             }
1570             
1571             resizeNurseries((nat)blocks);
1572         }
1573         else
1574         {
1575             // we might have added extra large blocks to the nursery, so
1576             // resize back to minAllocAreaSize again.
1577             resizeNurseriesFixed(RtsFlags.GcFlags.minAllocAreaSize);
1578         }
1579     }
1580 }
1581
1582 /* -----------------------------------------------------------------------------
1583    Sanity code for CAF garbage collection.
1584
1585    With DEBUG turned on, we manage a CAF list in addition to the SRT
1586    mechanism.  After GC, we run down the CAF list and blackhole any
1587    CAFs which have been garbage collected.  This means we get an error
1588    whenever the program tries to enter a garbage collected CAF.
1589
1590    Any garbage collected CAFs are taken off the CAF list at the same
1591    time. 
1592    -------------------------------------------------------------------------- */
1593
1594 #if 0 && defined(DEBUG)
1595
1596 static void
1597 gcCAFs(void)
1598 {
1599   StgClosure*  p;
1600   StgClosure** pp;
1601   const StgInfoTable *info;
1602   nat i;
1603
1604   i = 0;
1605   p = caf_list;
1606   pp = &caf_list;
1607
1608   while (p != NULL) {
1609     
1610     info = get_itbl(p);
1611
1612     ASSERT(info->type == IND_STATIC);
1613
1614     if (STATIC_LINK(info,p) == NULL) {
1615         debugTrace(DEBUG_gccafs, "CAF gc'd at 0x%04lx", (long)p);
1616         // black hole it 
1617         SET_INFO(p,&stg_BLACKHOLE_info);
1618         p = STATIC_LINK2(info,p);
1619         *pp = p;
1620     }
1621     else {
1622       pp = &STATIC_LINK2(info,p);
1623       p = *pp;
1624       i++;
1625     }
1626
1627   }
1628
1629   debugTrace(DEBUG_gccafs, "%d CAFs live", i); 
1630 }
1631 #endif