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