Initial parallel GC support
[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
44 #include "GC.h"
45 #include "Compact.h"
46 #include "Evac.h"
47 #include "Scav.h"
48 #include "GCUtils.h"
49 #include "MarkWeak.h"
50 #include "Sparks.h"
51
52 #include <string.h> // for memset()
53
54 /* -----------------------------------------------------------------------------
55    Global variables
56    -------------------------------------------------------------------------- */
57
58 /* STATIC OBJECT LIST.
59  *
60  * During GC:
61  * We maintain a linked list of static objects that are still live.
62  * The requirements for this list are:
63  *
64  *  - we need to scan the list while adding to it, in order to
65  *    scavenge all the static objects (in the same way that
66  *    breadth-first scavenging works for dynamic objects).
67  *
68  *  - we need to be able to tell whether an object is already on
69  *    the list, to break loops.
70  *
71  * Each static object has a "static link field", which we use for
72  * linking objects on to the list.  We use a stack-type list, consing
73  * objects on the front as they are added (this means that the
74  * scavenge phase is depth-first, not breadth-first, but that
75  * shouldn't matter).  
76  *
77  * A separate list is kept for objects that have been scavenged
78  * already - this is so that we can zero all the marks afterwards.
79  *
80  * An object is on the list if its static link field is non-zero; this
81  * means that we have to mark the end of the list with '1', not NULL.  
82  *
83  * Extra notes for generational GC:
84  *
85  * Each generation has a static object list associated with it.  When
86  * collecting generations up to N, we treat the static object lists
87  * from generations > N as roots.
88  *
89  * We build up a static object list while collecting generations 0..N,
90  * which is then appended to the static object list of generation N+1.
91  */
92 StgClosure* static_objects;      // live static objects
93 StgClosure* scavenged_static_objects;   // static objects scavenged so far
94 #ifdef THREADED_RTS
95 SpinLock static_objects_sync;
96 #endif
97
98 /* N is the oldest generation being collected, where the generations
99  * are numbered starting at 0.  A major GC (indicated by the major_gc
100  * flag) is when we're collecting all generations.  We only attempt to
101  * deal with static objects and GC CAFs when doing a major GC.
102  */
103 nat N;
104 rtsBool major_gc;
105
106 /* Data used for allocation area sizing.
107  */
108 static lnat g0s0_pcnt_kept = 30; // percentage of g0s0 live at last minor GC 
109
110 /* Mut-list stats */
111 #ifdef DEBUG
112 nat mutlist_MUTVARS,
113     mutlist_MUTARRS,
114     mutlist_MVARS,
115     mutlist_OTHERS;
116 #endif
117
118 /* Thread-local data for each GC thread
119  */
120 gc_thread *gc_threads = NULL;
121 // gc_thread *gct = NULL;  // this thread's gct TODO: make thread-local
122
123 // For stats:
124 long copied;        // *words* copied & scavenged during this GC
125 long scavd_copied;  // *words* copied only during this GC
126
127 #ifdef THREADED_RTS
128 SpinLock recordMutableGen_sync;
129 #endif
130
131 /* -----------------------------------------------------------------------------
132    Static function declarations
133    -------------------------------------------------------------------------- */
134
135 static void mark_root               (StgClosure **root);
136 static void zero_static_object_list (StgClosure* first_static);
137 static void initialise_N            (rtsBool force_major_gc);
138 static void alloc_gc_threads        (void);
139 static void init_collected_gen      (nat g, nat threads);
140 static void init_uncollected_gen    (nat g, nat threads);
141 static void init_gc_thread          (gc_thread *t);
142 static void update_task_list        (void);
143 static void resize_generations      (void);
144 static void resize_nursery          (void);
145 static void start_gc_threads        (void);
146 static void gc_thread_work          (void);
147 static nat  inc_running             (void);
148 static nat  dec_running             (void);
149 static void wakeup_gc_threads       (nat n_threads);
150
151 #if 0 && defined(DEBUG)
152 static void gcCAFs                  (void);
153 #endif
154
155 /* -----------------------------------------------------------------------------
156    The mark bitmap & stack.
157    -------------------------------------------------------------------------- */
158
159 #define MARK_STACK_BLOCKS 4
160
161 bdescr *mark_stack_bdescr;
162 StgPtr *mark_stack;
163 StgPtr *mark_sp;
164 StgPtr *mark_splim;
165
166 // Flag and pointers used for falling back to a linear scan when the
167 // mark stack overflows.
168 rtsBool mark_stack_overflowed;
169 bdescr *oldgen_scan_bd;
170 StgPtr  oldgen_scan;
171
172 /* -----------------------------------------------------------------------------
173    GarbageCollect: the main entry point to the garbage collector.
174
175    Locks held: all capabilities are held throughout GarbageCollect().
176    -------------------------------------------------------------------------- */
177
178 void
179 GarbageCollect ( rtsBool force_major_gc )
180 {
181   bdescr *bd;
182   step *stp;
183   lnat live, allocated;
184   lnat oldgen_saved_blocks = 0;
185   nat n_threads; // number of threads participating in GC
186
187   nat g, s, t;
188
189 #ifdef PROFILING
190   CostCentreStack *prev_CCS;
191 #endif
192
193   ACQUIRE_SM_LOCK;
194
195   debugTrace(DEBUG_gc, "starting GC");
196
197 #if defined(RTS_USER_SIGNALS)
198   if (RtsFlags.MiscFlags.install_signal_handlers) {
199     // block signals
200     blockUserSignals();
201   }
202 #endif
203
204   // tell the STM to discard any cached closures it's hoping to re-use
205   stmPreGCHook();
206
207   // tell the stats department that we've started a GC 
208   stat_startGC();
209
210 #ifdef DEBUG
211   // check for memory leaks if DEBUG is on 
212   memInventory();
213 #endif
214
215 #ifdef DEBUG
216   mutlist_MUTVARS = 0;
217   mutlist_MUTARRS = 0;
218   mutlist_OTHERS = 0;
219 #endif
220
221   // attribute any costs to CCS_GC 
222 #ifdef PROFILING
223   prev_CCS = CCCS;
224   CCCS = CCS_GC;
225 #endif
226
227   /* Approximate how much we allocated.  
228    * Todo: only when generating stats? 
229    */
230   allocated = calcAllocated();
231
232   /* Figure out which generation to collect
233    */
234   initialise_N(force_major_gc);
235
236   /* Allocate + initialise the gc_thread structures.
237    */
238   alloc_gc_threads();
239
240   /* Start threads, so they can be spinning up while we finish initialisation.
241    */
242   start_gc_threads();
243
244   /* How many threads will be participating in this GC?
245    * We don't try to parallelise minor GC.
246    */
247 #if defined(THREADED_RTS)
248   if (N == 0) {
249       n_threads = 1;
250   } else {
251       n_threads = RtsFlags.ParFlags.gcThreads;
252   }
253 #else
254   n_threads = 1;
255 #endif
256
257 #ifdef RTS_GTK_FRONTPANEL
258   if (RtsFlags.GcFlags.frontpanel) {
259       updateFrontPanelBeforeGC(N);
260   }
261 #endif
262
263   // check stack sanity *before* GC (ToDo: check all threads) 
264   IF_DEBUG(sanity, checkFreeListSanity());
265
266   /* Initialise the static object lists
267    */
268   static_objects = END_OF_STATIC_LIST;
269   scavenged_static_objects = END_OF_STATIC_LIST;
270
271 #ifdef THREADED_RTS
272   initSpinLock(&static_objects_sync);
273   initSpinLock(&recordMutableGen_sync);
274   initSpinLock(&gc_alloc_block_sync);
275 #endif
276
277   // Initialise all the generations/steps that we're collecting.
278   for (g = 0; g <= N; g++) {
279       init_collected_gen(g,n_threads);
280   }
281   
282   // Initialise all the generations/steps that we're *not* collecting.
283   for (g = N+1; g < RtsFlags.GcFlags.generations; g++) {
284       init_uncollected_gen(g,n_threads);
285   }
286
287   /* Allocate a mark stack if we're doing a major collection.
288    */
289   if (major_gc) {
290       mark_stack_bdescr = allocGroup(MARK_STACK_BLOCKS);
291       mark_stack = (StgPtr *)mark_stack_bdescr->start;
292       mark_sp    = mark_stack;
293       mark_splim = mark_stack + (MARK_STACK_BLOCKS * BLOCK_SIZE_W);
294   } else {
295       mark_stack_bdescr = NULL;
296   }
297
298   // Initialise all our gc_thread structures
299   for (t = 0; t < n_threads; t++) {
300       init_gc_thread(&gc_threads[t]);
301   }
302
303   // the main thread is running: this prevents any other threads from
304   // exiting prematurely, so we can start them now.
305   inc_running();
306   wakeup_gc_threads(n_threads);
307
308   // Initialise stats
309   copied = 0;
310   scavd_copied = 0;
311
312   // this is the main thread
313   gct = &gc_threads[0];
314
315   /* -----------------------------------------------------------------------
316    * follow all the roots that we know about:
317    *   - mutable lists from each generation > N
318    * we want to *scavenge* these roots, not evacuate them: they're not
319    * going to move in this GC.
320    * Also do them in reverse generation order, for the usual reason:
321    * namely to reduce the likelihood of spurious old->new pointers.
322    */
323   { 
324     for (g = RtsFlags.GcFlags.generations-1; g > N; g--) {
325       generations[g].saved_mut_list = generations[g].mut_list;
326       generations[g].mut_list = allocBlock(); 
327         // mut_list always has at least one block.
328     }
329     for (g = RtsFlags.GcFlags.generations-1; g > N; g--) {
330       scavenge_mutable_list(&generations[g]);
331     }
332   }
333
334   // follow roots from the CAF list (used by GHCi)
335   gct->evac_gen = 0;
336   markCAFs(mark_root);
337
338   // follow all the roots that the application knows about.
339   gct->evac_gen = 0;
340   GetRoots(mark_root);
341
342   // Mark the weak pointer list, and prepare to detect dead weak pointers.
343   markWeakPtrList();
344   initWeakForGC();
345
346   // Mark the stable pointer table.
347   markStablePtrTable(mark_root);
348
349   /* -------------------------------------------------------------------------
350    * Repeatedly scavenge all the areas we know about until there's no
351    * more scavenging to be done.
352    */
353   for (;;)
354   {
355       gc_thread_work();
356       // The other threads are now stopped.  We might recurse back to
357       // here, but from now on this is the only thread.
358       
359       // if any blackholes are alive, make the threads that wait on
360       // them alive too.
361       if (traverseBlackholeQueue()) {
362           inc_running(); 
363           continue;
364       }
365   
366       // must be last...  invariant is that everything is fully
367       // scavenged at this point.
368       if (traverseWeakPtrList()) { // returns rtsTrue if evaced something 
369           inc_running();
370           continue;
371       }
372
373       // If we get to here, there's really nothing left to do.
374       break;
375   }
376
377   // Update pointers from the Task list
378   update_task_list();
379
380   // Now see which stable names are still alive.
381   gcStablePtrTable();
382
383 #ifdef PROFILING
384   // We call processHeapClosureForDead() on every closure destroyed during
385   // the current garbage collection, so we invoke LdvCensusForDead().
386   if (RtsFlags.ProfFlags.doHeapProfile == HEAP_BY_LDV
387       || RtsFlags.ProfFlags.bioSelector != NULL)
388     LdvCensusForDead(N);
389 #endif
390
391   // NO MORE EVACUATION AFTER THIS POINT!
392   // Finally: compaction of the oldest generation.
393   if (major_gc && oldest_gen->steps[0].is_compacted) {
394       // save number of blocks for stats
395       oldgen_saved_blocks = oldest_gen->steps[0].n_old_blocks;
396       compact();
397   }
398
399   IF_DEBUG(sanity, checkGlobalTSOList(rtsFalse));
400
401   // Two-space collector: free the old to-space.
402   // g0s0->old_blocks is the old nursery
403   // g0s0->blocks is to-space from the previous GC
404   if (RtsFlags.GcFlags.generations == 1) {
405       if (g0s0->blocks != NULL) {
406           freeChain(g0s0->blocks);
407           g0s0->blocks = NULL;
408       }
409   }
410
411   // For each workspace, in each thread:
412   //    * clear the BF_EVACUATED flag from each copied block
413   //    * move the copied blocks to the step
414   {
415       gc_thread *thr;
416       step_workspace *ws;
417       bdescr *prev;
418
419       for (t = 0; t < n_threads; t++) {
420           thr = &gc_threads[t];
421
422           for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
423               for (s = 0; s < generations[g].n_steps; s++) {
424                   ws = &thr->steps[g][s];
425                   if (g==0 && s==0) continue;
426
427                   // Not true?
428                   // ASSERT( ws->scan_bd == ws->todo_bd );
429                   ASSERT( ws->scan_bd ? ws->scan == ws->scan_bd->free : 1 );
430
431                   // Push the final block
432                   if (ws->scan_bd) { push_scan_block(ws->scan_bd, ws); }
433
434                   // update stats: we haven't counted the block at the
435                   // front of the scavd_list yet.
436                   scavd_copied += ws->scavd_list->free - ws->scavd_list->start;
437
438                   ASSERT(countBlocks(ws->scavd_list) == ws->n_scavd_blocks);
439
440                   prev = ws->scavd_list;
441                   for (bd = ws->scavd_list; bd != NULL; bd = bd->link) {
442                       bd->flags &= ~BF_EVACUATED;        // now from-space 
443                       prev = bd;
444                   }
445                   prev->link = ws->stp->blocks;
446                   ws->stp->blocks = ws->scavd_list;
447                   ws->stp->n_blocks += ws->n_scavd_blocks;
448                   ASSERT(countBlocks(ws->stp->blocks) == ws->stp->n_blocks);
449               }
450           }
451       }
452   }
453
454   // Two-space collector: swap the semi-spaces around.
455   // Currently: g0s0->old_blocks is the old nursery
456   //            g0s0->blocks is to-space from this GC
457   // We want these the other way around.
458   if (RtsFlags.GcFlags.generations == 1) {
459       bdescr *nursery_blocks = g0s0->old_blocks;
460       nat n_nursery_blocks = g0s0->n_old_blocks;
461       g0s0->old_blocks = g0s0->blocks;
462       g0s0->n_old_blocks = g0s0->n_blocks;
463       g0s0->blocks = nursery_blocks;
464       g0s0->n_blocks = n_nursery_blocks;
465   }
466
467   /* run through all the generations/steps and tidy up 
468    */
469   for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
470
471     if (g <= N) {
472       generations[g].collections++; // for stats 
473     }
474
475     // Count the mutable list as bytes "copied" for the purposes of
476     // stats.  Every mutable list is copied during every GC.
477     if (g > 0) {
478         nat mut_list_size = 0;
479         for (bd = generations[g].mut_list; bd != NULL; bd = bd->link) {
480             mut_list_size += bd->free - bd->start;
481         }
482         copied +=  mut_list_size;
483
484         debugTrace(DEBUG_gc,
485                    "mut_list_size: %lu (%d vars, %d arrays, %d MVARs, %d others)",
486                    (unsigned long)(mut_list_size * sizeof(W_)),
487                    mutlist_MUTVARS, mutlist_MUTARRS, mutlist_MVARS, mutlist_OTHERS);
488     }
489
490     for (s = 0; s < generations[g].n_steps; s++) {
491       bdescr *next;
492       stp = &generations[g].steps[s];
493
494       // for generations we collected... 
495       if (g <= N) {
496
497         /* free old memory and shift to-space into from-space for all
498          * the collected steps (except the allocation area).  These
499          * freed blocks will probaby be quickly recycled.
500          */
501         if (!(g == 0 && s == 0 && RtsFlags.GcFlags.generations > 1)) {
502             if (stp->is_compacted)
503             {
504                 // for a compacted step, just shift the new to-space
505                 // onto the front of the now-compacted existing blocks.
506                 for (bd = stp->blocks; bd != NULL; bd = bd->link) {
507                     bd->flags &= ~BF_EVACUATED;  // now from-space 
508                 }
509                 // tack the new blocks on the end of the existing blocks
510                 if (stp->old_blocks != NULL) {
511                     for (bd = stp->old_blocks; bd != NULL; bd = next) {
512                         // NB. this step might not be compacted next
513                         // time, so reset the BF_COMPACTED flags.
514                         // They are set before GC if we're going to
515                         // compact.  (search for BF_COMPACTED above).
516                         bd->flags &= ~BF_COMPACTED;
517                         next = bd->link;
518                         if (next == NULL) {
519                             bd->link = stp->blocks;
520                         }
521                     }
522                     stp->blocks = stp->old_blocks;
523                 }
524                 // add the new blocks to the block tally
525                 stp->n_blocks += stp->n_old_blocks;
526                 ASSERT(countBlocks(stp->blocks) == stp->n_blocks);
527             }
528             else // not copacted
529             {
530                 freeChain(stp->old_blocks);
531             }
532             stp->old_blocks = NULL;
533             stp->n_old_blocks = 0;
534         }
535
536         /* LARGE OBJECTS.  The current live large objects are chained on
537          * scavenged_large, having been moved during garbage
538          * collection from large_objects.  Any objects left on
539          * large_objects list are therefore dead, so we free them here.
540          */
541         for (bd = stp->large_objects; bd != NULL; bd = next) {
542           next = bd->link;
543           freeGroup(bd);
544           bd = next;
545         }
546
547         // update the count of blocks used by large objects
548         for (bd = stp->scavenged_large_objects; bd != NULL; bd = bd->link) {
549           bd->flags &= ~BF_EVACUATED;
550         }
551         stp->large_objects  = stp->scavenged_large_objects;
552         stp->n_large_blocks = stp->n_scavenged_large_blocks;
553
554       }
555       else // for older generations... 
556       {
557         /* For older generations, we need to append the
558          * scavenged_large_object list (i.e. large objects that have been
559          * promoted during this GC) to the large_object list for that step.
560          */
561         for (bd = stp->scavenged_large_objects; bd; bd = next) {
562           next = bd->link;
563           bd->flags &= ~BF_EVACUATED;
564           dbl_link_onto(bd, &stp->large_objects);
565         }
566
567         // add the new blocks we promoted during this GC 
568         stp->n_large_blocks += stp->n_scavenged_large_blocks;
569       }
570     }
571   }
572
573   // update the max size of older generations after a major GC
574   resize_generations();
575   
576   // Guess the amount of live data for stats.
577   live = calcLive();
578
579   // Free the small objects allocated via allocate(), since this will
580   // all have been copied into G0S1 now.  
581   if (RtsFlags.GcFlags.generations > 1) {
582       if (g0s0->blocks != NULL) {
583           freeChain(g0s0->blocks);
584           g0s0->blocks = NULL;
585       }
586       g0s0->n_blocks = 0;
587   }
588   alloc_blocks = 0;
589   alloc_blocks_lim = RtsFlags.GcFlags.minAllocAreaSize;
590
591   // Start a new pinned_object_block
592   pinned_object_block = NULL;
593
594   // Free the mark stack.
595   if (mark_stack_bdescr != NULL) {
596       freeGroup(mark_stack_bdescr);
597   }
598
599   // Free any bitmaps.
600   for (g = 0; g <= N; g++) {
601       for (s = 0; s < generations[g].n_steps; s++) {
602           stp = &generations[g].steps[s];
603           if (stp->bitmap != NULL) {
604               freeGroup(stp->bitmap);
605               stp->bitmap = NULL;
606           }
607       }
608   }
609
610   resize_nursery();
611
612  // mark the garbage collected CAFs as dead 
613 #if 0 && defined(DEBUG) // doesn't work at the moment 
614   if (major_gc) { gcCAFs(); }
615 #endif
616   
617 #ifdef PROFILING
618   // resetStaticObjectForRetainerProfiling() must be called before
619   // zeroing below.
620   resetStaticObjectForRetainerProfiling();
621 #endif
622
623   // zero the scavenged static object list 
624   if (major_gc) {
625     zero_static_object_list(scavenged_static_objects);
626   }
627
628   // Reset the nursery
629   resetNurseries();
630
631   // start any pending finalizers 
632   RELEASE_SM_LOCK;
633   scheduleFinalizers(last_free_capability, old_weak_ptr_list);
634   ACQUIRE_SM_LOCK;
635   
636   // send exceptions to any threads which were about to die 
637   RELEASE_SM_LOCK;
638   resurrectThreads(resurrected_threads);
639   ACQUIRE_SM_LOCK;
640
641   // Update the stable pointer hash table.
642   updateStablePtrTable(major_gc);
643
644   // check sanity after GC 
645   IF_DEBUG(sanity, checkSanity());
646
647   // extra GC trace info 
648   IF_DEBUG(gc, statDescribeGens());
649
650 #ifdef DEBUG
651   // symbol-table based profiling 
652   /*  heapCensus(to_blocks); */ /* ToDo */
653 #endif
654
655   // restore enclosing cost centre 
656 #ifdef PROFILING
657   CCCS = prev_CCS;
658 #endif
659
660 #ifdef DEBUG
661   // check for memory leaks if DEBUG is on 
662   memInventory();
663 #endif
664
665 #ifdef RTS_GTK_FRONTPANEL
666   if (RtsFlags.GcFlags.frontpanel) {
667       updateFrontPanelAfterGC( N, live );
668   }
669 #endif
670
671   // ok, GC over: tell the stats department what happened. 
672   stat_endGC(allocated, live, copied, scavd_copied, N);
673
674 #if defined(RTS_USER_SIGNALS)
675   if (RtsFlags.MiscFlags.install_signal_handlers) {
676     // unblock signals again
677     unblockUserSignals();
678   }
679 #endif
680
681   RELEASE_SM_LOCK;
682 }
683
684 /* ---------------------------------------------------------------------------
685    Where are the roots that we know about?
686
687         - all the threads on the runnable queue
688         - all the threads on the blocked queue
689         - all the threads on the sleeping queue
690         - all the thread currently executing a _ccall_GC
691         - all the "main threads"
692      
693    ------------------------------------------------------------------------ */
694
695 /* This has to be protected either by the scheduler monitor, or by the
696         garbage collection monitor (probably the latter).
697         KH @ 25/10/99
698 */
699
700 void
701 GetRoots( evac_fn evac )
702 {
703     nat i;
704     Capability *cap;
705     Task *task;
706
707     for (i = 0; i < n_capabilities; i++) {
708         cap = &capabilities[i];
709         evac((StgClosure **)(void *)&cap->run_queue_hd);
710         evac((StgClosure **)(void *)&cap->run_queue_tl);
711 #if defined(THREADED_RTS)
712         evac((StgClosure **)(void *)&cap->wakeup_queue_hd);
713         evac((StgClosure **)(void *)&cap->wakeup_queue_tl);
714 #endif
715         for (task = cap->suspended_ccalling_tasks; task != NULL; 
716              task=task->next) {
717             debugTrace(DEBUG_sched,
718                        "evac'ing suspended TSO %lu", (unsigned long)task->suspended_tso->id);
719             evac((StgClosure **)(void *)&task->suspended_tso);
720         }
721
722     }
723     
724 #if !defined(THREADED_RTS)
725     evac((StgClosure **)(void *)&blocked_queue_hd);
726     evac((StgClosure **)(void *)&blocked_queue_tl);
727     evac((StgClosure **)(void *)&sleeping_queue);
728 #endif 
729
730     // evac((StgClosure **)&blackhole_queue);
731
732 #if defined(THREADED_RTS)
733     markSparkQueue(evac);
734 #endif
735     
736 #if defined(RTS_USER_SIGNALS)
737     // mark the signal handlers (signals should be already blocked)
738     markSignalHandlers(evac);
739 #endif
740 }
741
742 /* -----------------------------------------------------------------------------
743    isAlive determines whether the given closure is still alive (after
744    a garbage collection) or not.  It returns the new address of the
745    closure if it is alive, or NULL otherwise.
746
747    NOTE: Use it before compaction only!
748          It untags and (if needed) retags pointers to closures.
749    -------------------------------------------------------------------------- */
750
751
752 StgClosure *
753 isAlive(StgClosure *p)
754 {
755   const StgInfoTable *info;
756   bdescr *bd;
757   StgWord tag;
758   StgClosure *q;
759
760   while (1) {
761     /* The tag and the pointer are split, to be merged later when needed. */
762     tag = GET_CLOSURE_TAG(p);
763     q = UNTAG_CLOSURE(p);
764
765     ASSERT(LOOKS_LIKE_CLOSURE_PTR(q));
766     info = get_itbl(q);
767
768     // ignore static closures 
769     //
770     // ToDo: for static closures, check the static link field.
771     // Problem here is that we sometimes don't set the link field, eg.
772     // for static closures with an empty SRT or CONSTR_STATIC_NOCAFs.
773     //
774     if (!HEAP_ALLOCED(q)) {
775         return p;
776     }
777
778     // ignore closures in generations that we're not collecting. 
779     bd = Bdescr((P_)q);
780     if (bd->gen_no > N) {
781         return p;
782     }
783
784     // if it's a pointer into to-space, then we're done
785     if (bd->flags & BF_EVACUATED) {
786         return p;
787     }
788
789     // large objects use the evacuated flag
790     if (bd->flags & BF_LARGE) {
791         return NULL;
792     }
793
794     // check the mark bit for compacted steps
795     if ((bd->flags & BF_COMPACTED) && is_marked((P_)q,bd)) {
796         return p;
797     }
798
799     switch (info->type) {
800
801     case IND:
802     case IND_STATIC:
803     case IND_PERM:
804     case IND_OLDGEN:            // rely on compatible layout with StgInd 
805     case IND_OLDGEN_PERM:
806       // follow indirections 
807       p = ((StgInd *)q)->indirectee;
808       continue;
809
810     case EVACUATED:
811       // alive! 
812       return ((StgEvacuated *)q)->evacuee;
813
814     case TSO:
815       if (((StgTSO *)q)->what_next == ThreadRelocated) {
816         p = (StgClosure *)((StgTSO *)q)->link;
817         continue;
818       } 
819       return NULL;
820
821     default:
822       // dead. 
823       return NULL;
824     }
825   }
826 }
827
828 /* -----------------------------------------------------------------------------
829    Figure out which generation to collect, initialise N and major_gc.
830    -------------------------------------------------------------------------- */
831
832 static void
833 initialise_N (rtsBool force_major_gc)
834 {
835     nat g;
836
837     if (force_major_gc) {
838         N = RtsFlags.GcFlags.generations - 1;
839         major_gc = rtsTrue;
840     } else {
841         N = 0;
842         for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
843             if (generations[g].steps[0].n_blocks +
844                 generations[g].steps[0].n_large_blocks
845                 >= generations[g].max_blocks) {
846                 N = g;
847             }
848         }
849         major_gc = (N == RtsFlags.GcFlags.generations-1);
850     }
851 }
852
853 /* -----------------------------------------------------------------------------
854    Initialise the gc_thread structures.
855    -------------------------------------------------------------------------- */
856
857 static void
858 alloc_gc_thread (gc_thread *t, int n)
859 {
860     nat g, s;
861     step_workspace *ws;
862
863 #ifdef THREADED_RTS
864     t->id = 0;
865     initCondition(&t->wake_cond);
866     initMutex(&t->wake_mutex);
867     t->wakeup = rtsFalse;
868     t->exit   = rtsFalse;
869 #endif
870
871     t->thread_index = n;
872     t->free_blocks = NULL;
873     t->gc_count = 0;
874
875     init_gc_thread(t);
876     
877     t->steps = stgMallocBytes(RtsFlags.GcFlags.generations * 
878                                 sizeof(step_workspace *), 
879                                 "initialise_gc_thread");
880
881     for (g = 0; g < RtsFlags.GcFlags.generations; g++)
882     {
883         t->steps[g] = stgMallocBytes(generations[g].n_steps * 
884                                        sizeof(step_workspace),
885                                        "initialise_gc_thread/2");
886
887         for (s = 0; s < generations[g].n_steps; s++)
888         {
889             ws = &t->steps[g][s];
890             ws->stp = &generations[g].steps[s];
891             ws->gct = t;
892
893             ws->scan_bd = NULL;
894             ws->scan = NULL;
895
896             ws->todo_bd = NULL;
897             ws->buffer_todo_bd = NULL;
898
899             ws->scavd_list = NULL;
900             ws->n_scavd_blocks = 0;
901         }
902     }
903 }
904
905
906 static void
907 alloc_gc_threads (void)
908 {
909     if (gc_threads == NULL) {
910 #if defined(THREADED_RTS)
911         nat i;
912         gc_threads = stgMallocBytes (RtsFlags.ParFlags.gcThreads * 
913                                      sizeof(gc_thread), 
914                                      "alloc_gc_threads");
915
916         for (i = 0; i < RtsFlags.ParFlags.gcThreads; i++) {
917             alloc_gc_thread(&gc_threads[i], i);
918         }
919 #else
920         gc_threads = stgMallocBytes (sizeof(gc_thread), 
921                                      "alloc_gc_threads");
922
923         alloc_gc_thread(gc_threads, 0);
924 #endif
925     }
926 }
927
928 /* ----------------------------------------------------------------------------
929    Start GC threads
930    ------------------------------------------------------------------------- */
931
932 static nat gc_running_threads;
933
934 #if defined(THREADED_RTS)
935 static Mutex gc_running_mutex;
936 #endif
937
938 static nat
939 inc_running (void)
940 {
941     nat n_running;
942     ACQUIRE_LOCK(&gc_running_mutex);
943     n_running = ++gc_running_threads;
944     RELEASE_LOCK(&gc_running_mutex);
945     return n_running;
946 }
947
948 static nat
949 dec_running (void)
950 {
951     nat n_running;
952     ACQUIRE_LOCK(&gc_running_mutex);
953     n_running = --gc_running_threads;
954     RELEASE_LOCK(&gc_running_mutex);
955     return n_running;
956 }
957
958 //
959 // gc_thread_work(): Scavenge until there's no work left to do and all
960 // the running threads are idle.
961 //
962 static void
963 gc_thread_work (void)
964 {
965     nat r;
966         
967     debugTrace(DEBUG_gc, "GC thread %d working", gct->thread_index);
968
969     // gc_running_threads has already been incremented for us; either
970     // this is the main thread and we incremented it inside
971     // GarbageCollect(), or this is a worker thread and the main
972     // thread bumped gc_running_threads before waking us up.
973
974 loop:
975     scavenge_loop();
976     // scavenge_loop() only exits when there's no work to do
977     r = dec_running();
978     
979     debugTrace(DEBUG_gc, "GC thread %d idle (%d still running)", 
980                gct->thread_index, r);
981
982     while (gc_running_threads != 0) {
983         if (any_work()) {
984             inc_running();
985             goto loop;
986         }
987         // any_work() does not remove the work from the queue, it
988         // just checks for the presence of work.  If we find any,
989         // then we increment gc_running_threads and go back to 
990         // scavenge_loop() to perform any pending work.
991     }
992     
993     // All threads are now stopped
994     debugTrace(DEBUG_gc, "GC thread %d finished.", gct->thread_index);
995 }
996
997
998 #if defined(THREADED_RTS)
999 static void
1000 gc_thread_mainloop (void)
1001 {
1002     while (!gct->exit) {
1003
1004         // Wait until we're told to wake up
1005         ACQUIRE_LOCK(&gct->wake_mutex);
1006         while (!gct->wakeup) {
1007             debugTrace(DEBUG_gc, "GC thread %d standing by...", 
1008                        gct->thread_index);
1009             waitCondition(&gct->wake_cond, &gct->wake_mutex);
1010         }
1011         RELEASE_LOCK(&gct->wake_mutex);
1012         gct->wakeup = rtsFalse;
1013         if (gct->exit) break;
1014
1015         gc_thread_work();
1016     }
1017 }       
1018 #endif
1019
1020 #if defined(THREADED_RTS)
1021 static void
1022 gc_thread_entry (gc_thread *my_gct)
1023 {
1024     gct = my_gct;
1025     debugTrace(DEBUG_gc, "GC thread %d starting...", gct->thread_index);
1026     gct->id = osThreadId();
1027     gc_thread_mainloop();
1028 }
1029 #endif
1030
1031 static void
1032 start_gc_threads (void)
1033 {
1034 #if defined(THREADED_RTS)
1035     nat i;
1036     OSThreadId id;
1037     static rtsBool done = rtsFalse;
1038
1039     gc_running_threads = 0;
1040     initMutex(&gc_running_mutex);
1041
1042     if (!done) {
1043         // Start from 1: the main thread is 0
1044         for (i = 1; i < RtsFlags.ParFlags.gcThreads; i++) {
1045             createOSThread(&id, (OSThreadProc*)&gc_thread_entry, 
1046                            &gc_threads[i]);
1047         }
1048         done = rtsTrue;
1049     }
1050 #endif
1051 }
1052
1053 static void
1054 wakeup_gc_threads (nat n_threads USED_IF_THREADS)
1055 {
1056 #if defined(THREADED_RTS)
1057     nat i;
1058     for (i=1; i < n_threads; i++) {
1059         inc_running();
1060         ACQUIRE_LOCK(&gc_threads[i].wake_mutex);
1061         gc_threads[i].wakeup = rtsTrue;
1062         signalCondition(&gc_threads[i].wake_cond);
1063         RELEASE_LOCK(&gc_threads[i].wake_mutex);
1064     }
1065 #endif
1066 }
1067
1068 /* ----------------------------------------------------------------------------
1069    Initialise a generation that is to be collected 
1070    ------------------------------------------------------------------------- */
1071
1072 static void
1073 init_collected_gen (nat g, nat n_threads)
1074 {
1075     nat s, t, i;
1076     step_workspace *ws;
1077     step *stp;
1078     bdescr *bd;
1079
1080     // Throw away the current mutable list.  Invariant: the mutable
1081     // list always has at least one block; this means we can avoid a
1082     // check for NULL in recordMutable().
1083     if (g != 0) {
1084         freeChain(generations[g].mut_list);
1085         generations[g].mut_list = allocBlock();
1086         for (i = 0; i < n_capabilities; i++) {
1087             freeChain(capabilities[i].mut_lists[g]);
1088             capabilities[i].mut_lists[g] = allocBlock();
1089         }
1090     }
1091
1092     for (s = 0; s < generations[g].n_steps; s++) {
1093
1094         // generation 0, step 0 doesn't need to-space 
1095         if (g == 0 && s == 0 && RtsFlags.GcFlags.generations > 1) { 
1096             continue; 
1097         }
1098         
1099         stp = &generations[g].steps[s];
1100         ASSERT(stp->gen_no == g);
1101
1102         // deprecate the existing blocks
1103         stp->old_blocks   = stp->blocks;
1104         stp->n_old_blocks = stp->n_blocks;
1105         stp->blocks       = NULL;
1106         stp->n_blocks     = 0;
1107
1108         // we don't have any to-be-scavenged blocks yet
1109         stp->todos = NULL;
1110         stp->n_todos = 0;
1111
1112         // initialise the large object queues.
1113         stp->scavenged_large_objects = NULL;
1114         stp->n_scavenged_large_blocks = 0;
1115
1116         // mark the large objects as not evacuated yet 
1117         for (bd = stp->large_objects; bd; bd = bd->link) {
1118             bd->flags &= ~BF_EVACUATED;
1119         }
1120
1121         // for a compacted step, we need to allocate the bitmap
1122         if (stp->is_compacted) {
1123             nat bitmap_size; // in bytes
1124             bdescr *bitmap_bdescr;
1125             StgWord *bitmap;
1126             
1127             bitmap_size = stp->n_old_blocks * BLOCK_SIZE / (sizeof(W_)*BITS_PER_BYTE);
1128             
1129             if (bitmap_size > 0) {
1130                 bitmap_bdescr = allocGroup((lnat)BLOCK_ROUND_UP(bitmap_size) 
1131                                            / BLOCK_SIZE);
1132                 stp->bitmap = bitmap_bdescr;
1133                 bitmap = bitmap_bdescr->start;
1134                 
1135                 debugTrace(DEBUG_gc, "bitmap_size: %d, bitmap: %p",
1136                            bitmap_size, bitmap);
1137                 
1138                 // don't forget to fill it with zeros!
1139                 memset(bitmap, 0, bitmap_size);
1140                 
1141                 // For each block in this step, point to its bitmap from the
1142                 // block descriptor.
1143                 for (bd=stp->old_blocks; bd != NULL; bd = bd->link) {
1144                     bd->u.bitmap = bitmap;
1145                     bitmap += BLOCK_SIZE_W / (sizeof(W_)*BITS_PER_BYTE);
1146                     
1147                     // Also at this point we set the BF_COMPACTED flag
1148                     // for this block.  The invariant is that
1149                     // BF_COMPACTED is always unset, except during GC
1150                     // when it is set on those blocks which will be
1151                     // compacted.
1152                     bd->flags |= BF_COMPACTED;
1153                 }
1154             }
1155         }
1156     }
1157
1158     // For each GC thread, for each step, allocate a "todo" block to
1159     // store evacuated objects to be scavenged, and a block to store
1160     // evacuated objects that do not need to be scavenged.
1161     for (t = 0; t < n_threads; t++) {
1162         for (s = 0; s < generations[g].n_steps; s++) {
1163
1164             // we don't copy objects into g0s0, unless -G0
1165             if (g==0 && s==0 && RtsFlags.GcFlags.generations > 1) continue;
1166
1167             ws = &gc_threads[t].steps[g][s];
1168
1169             ws->scan_bd = NULL;
1170             ws->scan = NULL;
1171
1172             ws->todo_large_objects = NULL;
1173
1174             // allocate the first to-space block; extra blocks will be
1175             // chained on as necessary.
1176             ws->todo_bd = NULL;
1177             ws->buffer_todo_bd = NULL;
1178             gc_alloc_todo_block(ws);
1179
1180             // allocate a block for "already scavenged" objects.  This goes
1181             // on the front of the stp->blocks list, so it won't be
1182             // traversed by the scavenging sweep.
1183             ws->scavd_list = NULL;
1184             ws->n_scavd_blocks = 0;
1185             gc_alloc_scavd_block(ws);
1186         }
1187     }
1188 }
1189
1190
1191 /* ----------------------------------------------------------------------------
1192    Initialise a generation that is *not* to be collected 
1193    ------------------------------------------------------------------------- */
1194
1195 static void
1196 init_uncollected_gen (nat g, nat threads)
1197 {
1198     nat s, t, i;
1199     step_workspace *ws;
1200     step *stp;
1201     bdescr *bd;
1202
1203     for (s = 0; s < generations[g].n_steps; s++) {
1204         stp = &generations[g].steps[s];
1205         stp->scavenged_large_objects = NULL;
1206         stp->n_scavenged_large_blocks = 0;
1207     }
1208     
1209     for (t = 0; t < threads; t++) {
1210         for (s = 0; s < generations[g].n_steps; s++) {
1211             
1212             ws = &gc_threads[t].steps[g][s];
1213             stp = ws->stp;
1214             
1215             ws->buffer_todo_bd = NULL;
1216             ws->todo_large_objects = NULL;
1217
1218             // If the block at the head of the list in this generation
1219             // is less than 3/4 full, then use it as a todo block.
1220             if (isPartiallyFull(stp->blocks))
1221             {
1222                 ws->todo_bd = stp->blocks;
1223                 stp->blocks = stp->blocks->link;
1224                 stp->n_blocks -= 1;
1225                 ws->todo_bd->link = NULL;
1226
1227                 // this block is also the scan block; we must scan
1228                 // from the current end point.
1229                 ws->scan_bd = ws->todo_bd;
1230                 ws->scan = ws->scan_bd->free;
1231
1232                 // subtract the contents of this block from the stats,
1233                 // because we'll count the whole block later.
1234                 copied -= ws->scan_bd->free - ws->scan_bd->start;
1235             } 
1236             else
1237             {
1238                 ws->scan_bd = NULL;
1239                 ws->scan = NULL;
1240                 ws->todo_bd = NULL;
1241                 gc_alloc_todo_block(ws);
1242             }
1243
1244             // Do the same trick for the scavd block
1245             if (isPartiallyFull(stp->blocks))
1246             {
1247                 ws->scavd_list = stp->blocks;
1248                 stp->blocks = stp->blocks->link;
1249                 stp->n_blocks -= 1;
1250                 ws->scavd_list->link = NULL;
1251                 ws->n_scavd_blocks = 1;
1252                 // subtract the contents of this block from the stats,
1253                 // because we'll count the whole block later.
1254                 scavd_copied -= ws->scavd_list->free - ws->scavd_list->start;
1255             }
1256             else
1257             {
1258                 ws->scavd_list = NULL;
1259                 ws->n_scavd_blocks = 0;
1260                 gc_alloc_scavd_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_gen = 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   *root = 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