501a9e52d4ba0f6062d9472e0093a601fa63c6fb
[ghc-hetmet.git] / rts / sm / GC.c
1 /* -----------------------------------------------------------------------------
2  *
3  * (c) The GHC Team 1998-2008
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 "Papi.h"
43
44 #include "GC.h"
45 #include "GCThread.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 #include "Sweep.h"
53
54 #include <string.h> // for memset()
55 #include <unistd.h>
56
57 /* -----------------------------------------------------------------------------
58    Global variables
59    -------------------------------------------------------------------------- */
60
61 /* STATIC OBJECT LIST.
62  *
63  * During GC:
64  * We maintain a linked list of static objects that are still live.
65  * The requirements for this list are:
66  *
67  *  - we need to scan the list while adding to it, in order to
68  *    scavenge all the static objects (in the same way that
69  *    breadth-first scavenging works for dynamic objects).
70  *
71  *  - we need to be able to tell whether an object is already on
72  *    the list, to break loops.
73  *
74  * Each static object has a "static link field", which we use for
75  * linking objects on to the list.  We use a stack-type list, consing
76  * objects on the front as they are added (this means that the
77  * scavenge phase is depth-first, not breadth-first, but that
78  * shouldn't matter).  
79  *
80  * A separate list is kept for objects that have been scavenged
81  * already - this is so that we can zero all the marks afterwards.
82  *
83  * An object is on the list if its static link field is non-zero; this
84  * means that we have to mark the end of the list with '1', not NULL.  
85  *
86  * Extra notes for generational GC:
87  *
88  * Each generation has a static object list associated with it.  When
89  * collecting generations up to N, we treat the static object lists
90  * from generations > N as roots.
91  *
92  * We build up a static object list while collecting generations 0..N,
93  * which is then appended to the static object list of generation N+1.
94  */
95
96 /* N is the oldest generation being collected, where the generations
97  * are numbered starting at 0.  A major GC (indicated by the major_gc
98  * flag) is when we're collecting all generations.  We only attempt to
99  * deal with static objects and GC CAFs when doing a major GC.
100  */
101 nat N;
102 rtsBool major_gc;
103
104 /* Data used for allocation area sizing.
105  */
106 static lnat g0s0_pcnt_kept = 30; // percentage of g0s0 live at last minor GC 
107
108 /* Mut-list stats */
109 #ifdef DEBUG
110 nat mutlist_MUTVARS,
111     mutlist_MUTARRS,
112     mutlist_MVARS,
113     mutlist_OTHERS;
114 #endif
115
116 /* Thread-local data for each GC thread
117  */
118 gc_thread **gc_threads = NULL;
119 // gc_thread *gct = NULL;  // this thread's gct TODO: make thread-local
120
121 // Number of threads running in *this* GC.  Affects how many
122 // step->todos[] lists we have to look in to find work.
123 nat n_gc_threads;
124
125 // For stats:
126 long copied;        // *words* copied & scavenged during this GC
127
128 rtsBool work_stealing;
129
130 DECLARE_GCT
131
132 /* -----------------------------------------------------------------------------
133    Static function declarations
134    -------------------------------------------------------------------------- */
135
136 static void mark_root               (void *user, StgClosure **root);
137 static void zero_static_object_list (StgClosure* first_static);
138 static nat  initialise_N            (rtsBool force_major_gc);
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 scavenge_until_all_done (void);
147 static nat  inc_running             (void);
148 static nat  dec_running             (void);
149 static void wakeup_gc_threads       (nat n_threads, nat me);
150 static void shutdown_gc_threads     (nat n_threads, nat me);
151
152 #if 0 && defined(DEBUG)
153 static void gcCAFs                  (void);
154 #endif
155
156 /* -----------------------------------------------------------------------------
157    The mark bitmap & stack.
158    -------------------------------------------------------------------------- */
159
160 #define MARK_STACK_BLOCKS 4
161
162 bdescr *mark_stack_bdescr;
163 StgPtr *mark_stack;
164 StgPtr *mark_sp;
165 StgPtr *mark_splim;
166
167 // Flag and pointers used for falling back to a linear scan when the
168 // mark stack overflows.
169 rtsBool mark_stack_overflowed;
170 bdescr *oldgen_scan_bd;
171 StgPtr  oldgen_scan;
172
173 /* -----------------------------------------------------------------------------
174    GarbageCollect: the main entry point to the garbage collector.
175
176    Locks held: all capabilities are held throughout GarbageCollect().
177    -------------------------------------------------------------------------- */
178
179 void
180 GarbageCollect (rtsBool force_major_gc, 
181                 nat gc_type USED_IF_THREADS,
182                 Capability *cap)
183 {
184   bdescr *bd;
185   step *stp;
186   lnat live, allocated, max_copied, avg_copied, slop;
187   gc_thread *saved_gct;
188   nat g, s, t, n;
189
190   // necessary if we stole a callee-saves register for gct:
191   saved_gct = gct;
192
193 #ifdef PROFILING
194   CostCentreStack *prev_CCS;
195 #endif
196
197   ACQUIRE_SM_LOCK;
198
199 #if defined(RTS_USER_SIGNALS)
200   if (RtsFlags.MiscFlags.install_signal_handlers) {
201     // block signals
202     blockUserSignals();
203   }
204 #endif
205
206   ASSERT(sizeof(step_workspace) == 16 * sizeof(StgWord));
207   // otherwise adjust the padding in step_workspace.
208
209   // tell the stats department that we've started a GC 
210   stat_startGC();
211
212   // tell the STM to discard any cached closures it's hoping to re-use
213   stmPreGCHook();
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   n = initialise_N(force_major_gc);
235
236 #if defined(THREADED_RTS)
237   work_stealing = RtsFlags.ParFlags.parGcLoadBalancing;
238       // It's not always a good idea to do load balancing in parallel
239       // GC.  In particular, for a parallel program we don't want to
240       // lose locality by moving cached data into another CPU's cache
241       // (this effect can be quite significant). 
242       //
243       // We could have a more complex way to deterimine whether to do
244       // work stealing or not, e.g. it might be a good idea to do it
245       // if the heap is big.  For now, we just turn it on or off with
246       // a flag.
247 #endif
248
249   /* Start threads, so they can be spinning up while we finish initialisation.
250    */
251   start_gc_threads();
252
253 #if defined(THREADED_RTS)
254   /* How many threads will be participating in this GC?
255    * We don't try to parallelise minor GCs (unless the user asks for
256    * it with +RTS -gn0), or mark/compact/sweep GC.
257    */
258   if (gc_type == PENDING_GC_PAR) {
259       n_gc_threads = RtsFlags.ParFlags.nNodes;
260   } else {
261       n_gc_threads = 1;
262   }
263 #else
264   n_gc_threads = 1;
265 #endif
266
267   trace(TRACE_gc|DEBUG_gc, "GC (gen %d): %d KB to collect, %ld MB in use, using %d thread(s)",
268         N, n * (BLOCK_SIZE / 1024), mblocks_allocated, n_gc_threads);
269
270 #ifdef RTS_GTK_FRONTPANEL
271   if (RtsFlags.GcFlags.frontpanel) {
272       updateFrontPanelBeforeGC(N);
273   }
274 #endif
275
276 #ifdef DEBUG
277   // check for memory leaks if DEBUG is on 
278   memInventory(traceClass(DEBUG_gc));
279 #endif
280
281   // check stack sanity *before* GC
282   IF_DEBUG(sanity, checkFreeListSanity());
283   IF_DEBUG(sanity, checkMutableLists(rtsTrue));
284
285   // Initialise all our gc_thread structures
286   for (t = 0; t < n_gc_threads; t++) {
287       init_gc_thread(gc_threads[t]);
288   }
289
290   // Initialise all the generations/steps that we're collecting.
291   for (g = 0; g <= N; g++) {
292       init_collected_gen(g,n_gc_threads);
293   }
294   
295   // Initialise all the generations/steps that we're *not* collecting.
296   for (g = N+1; g < RtsFlags.GcFlags.generations; g++) {
297       init_uncollected_gen(g,n_gc_threads);
298   }
299
300   /* Allocate a mark stack if we're doing a major collection.
301    */
302   if (major_gc && oldest_gen->steps[0].mark) {
303       nat mark_stack_blocks;
304       mark_stack_blocks = stg_max(MARK_STACK_BLOCKS, 
305                                   oldest_gen->steps[0].n_old_blocks / 100);
306       mark_stack_bdescr = allocGroup(mark_stack_blocks);
307       mark_stack = (StgPtr *)mark_stack_bdescr->start;
308       mark_sp    = mark_stack;
309       mark_splim = mark_stack + (mark_stack_blocks * BLOCK_SIZE_W);
310   } else {
311       mark_stack_bdescr = NULL;
312   }
313
314   // this is the main thread
315 #ifdef THREADED_RTS
316   if (n_gc_threads == 1) {
317       gct = gc_threads[0];
318   } else {
319       gct = gc_threads[cap->no];
320   }
321 #else
322   gct = gc_threads[0];
323 #endif
324
325   /* -----------------------------------------------------------------------
326    * follow all the roots that we know about:
327    */
328
329   // the main thread is running: this prevents any other threads from
330   // exiting prematurely, so we can start them now.
331   // NB. do this after the mutable lists have been saved above, otherwise
332   // the other GC threads will be writing into the old mutable lists.
333   inc_running();
334   wakeup_gc_threads(n_gc_threads, gct->thread_index);
335
336   // Mutable lists from each generation > N
337   // we want to *scavenge* these roots, not evacuate them: they're not
338   // going to move in this GC.
339   // Also do them in reverse generation order, for the usual reason:
340   // namely to reduce the likelihood of spurious old->new pointers.
341   //
342   for (g = RtsFlags.GcFlags.generations-1; g > N; g--) {
343       scavenge_mutable_list(generations[g].saved_mut_list, &generations[g]);
344       freeChain_sync(generations[g].saved_mut_list);
345       generations[g].saved_mut_list = NULL;
346
347   }
348
349   // scavenge the capability-private mutable lists.  This isn't part
350   // of markSomeCapabilities() because markSomeCapabilities() can only
351   // call back into the GC via mark_root() (due to the gct register
352   // variable).
353   if (n_gc_threads == 1) {
354       for (n = 0; n < n_capabilities; n++) {
355           scavenge_capability_mut_lists(&capabilities[n]);
356       }
357   } else {
358       scavenge_capability_mut_lists(&capabilities[gct->thread_index]);
359   }
360
361   // follow roots from the CAF list (used by GHCi)
362   gct->evac_step = 0;
363   markCAFs(mark_root, gct);
364
365   // follow all the roots that the application knows about.
366   gct->evac_step = 0;
367   markSomeCapabilities(mark_root, gct, gct->thread_index, n_gc_threads,
368                        rtsTrue/*prune sparks*/);
369
370 #if defined(RTS_USER_SIGNALS)
371   // mark the signal handlers (signals should be already blocked)
372   markSignalHandlers(mark_root, gct);
373 #endif
374
375   // Mark the weak pointer list, and prepare to detect dead weak pointers.
376   markWeakPtrList();
377   initWeakForGC();
378
379   // Mark the stable pointer table.
380   markStablePtrTable(mark_root, gct);
381
382   /* -------------------------------------------------------------------------
383    * Repeatedly scavenge all the areas we know about until there's no
384    * more scavenging to be done.
385    */
386   for (;;)
387   {
388       scavenge_until_all_done();
389       // The other threads are now stopped.  We might recurse back to
390       // here, but from now on this is the only thread.
391       
392       // if any blackholes are alive, make the threads that wait on
393       // them alive too.
394       if (traverseBlackholeQueue()) {
395           inc_running(); 
396           continue;
397       }
398   
399       // must be last...  invariant is that everything is fully
400       // scavenged at this point.
401       if (traverseWeakPtrList()) { // returns rtsTrue if evaced something 
402           inc_running();
403           continue;
404       }
405
406       // If we get to here, there's really nothing left to do.
407       break;
408   }
409
410   shutdown_gc_threads(n_gc_threads, gct->thread_index);
411
412   // Update pointers from the Task list
413   update_task_list();
414
415   // Now see which stable names are still alive.
416   gcStablePtrTable();
417
418 #ifdef PROFILING
419   // We call processHeapClosureForDead() on every closure destroyed during
420   // the current garbage collection, so we invoke LdvCensusForDead().
421   if (RtsFlags.ProfFlags.doHeapProfile == HEAP_BY_LDV
422       || RtsFlags.ProfFlags.bioSelector != NULL)
423     LdvCensusForDead(N);
424 #endif
425
426   // NO MORE EVACUATION AFTER THIS POINT!
427
428   // Two-space collector: free the old to-space.
429   // g0s0->old_blocks is the old nursery
430   // g0s0->blocks is to-space from the previous GC
431   if (RtsFlags.GcFlags.generations == 1) {
432       if (g0s0->blocks != NULL) {
433           freeChain(g0s0->blocks);
434           g0s0->blocks = NULL;
435       }
436   }
437
438   // For each workspace, in each thread, move the copied blocks to the step
439   {
440       gc_thread *thr;
441       step_workspace *ws;
442       bdescr *prev, *next;
443
444       for (t = 0; t < n_gc_threads; t++) {
445           thr = gc_threads[t];
446
447           // not step 0
448           if (RtsFlags.GcFlags.generations == 1) {
449               s = 0;
450           } else {
451               s = 1;
452           }
453           for (; s < total_steps; s++) {
454               ws = &thr->steps[s];
455
456               // Push the final block
457               if (ws->todo_bd) { 
458                   push_scanned_block(ws->todo_bd, ws);
459               }
460
461               ASSERT(gct->scan_bd == NULL);
462               ASSERT(countBlocks(ws->scavd_list) == ws->n_scavd_blocks);
463               
464               prev = NULL;
465               for (bd = ws->scavd_list; bd != NULL; bd = bd->link) {
466                   ws->step->n_words += bd->free - bd->start;
467                   prev = bd;
468               }
469               if (prev != NULL) {
470                   prev->link = ws->step->blocks;
471                   ws->step->blocks = ws->scavd_list;
472               } 
473               ws->step->n_blocks += ws->n_scavd_blocks;
474           }
475       }
476
477       // Add all the partial blocks *after* we've added all the full
478       // blocks.  This is so that we can grab the partial blocks back
479       // again and try to fill them up in the next GC.
480       for (t = 0; t < n_gc_threads; t++) {
481           thr = gc_threads[t];
482
483           // not step 0
484           if (RtsFlags.GcFlags.generations == 1) {
485               s = 0;
486           } else {
487               s = 1;
488           }
489           for (; s < total_steps; s++) {
490               ws = &thr->steps[s];
491
492               prev = NULL;
493               for (bd = ws->part_list; bd != NULL; bd = next) {
494                   next = bd->link;
495                   if (bd->free == bd->start) {
496                       if (prev == NULL) {
497                           ws->part_list = next;
498                       } else {
499                           prev->link = next;
500                       }
501                       freeGroup(bd);
502                       ws->n_part_blocks--;
503                   } else {
504                       ws->step->n_words += bd->free - bd->start;
505                       prev = bd;
506                   }
507               }
508               if (prev != NULL) {
509                   prev->link = ws->step->blocks;
510                   ws->step->blocks = ws->part_list;
511               }
512               ws->step->n_blocks += ws->n_part_blocks;
513
514               ASSERT(countBlocks(ws->step->blocks) == ws->step->n_blocks);
515               ASSERT(countOccupied(ws->step->blocks) == ws->step->n_words);
516           }
517       }
518   }
519
520   // Finally: compact or sweep the oldest generation.
521   if (major_gc && oldest_gen->steps[0].mark) {
522       if (oldest_gen->steps[0].compact) 
523           compact(gct->scavenged_static_objects);
524       else
525           sweep(&oldest_gen->steps[0]);
526   }
527
528   /* run through all the generations/steps and tidy up 
529    */
530   copied = 0;
531   max_copied = 0;
532   avg_copied = 0;
533   { 
534       nat i;
535       for (i=0; i < n_gc_threads; i++) {
536           if (n_gc_threads > 1) {
537               trace(TRACE_gc,"thread %d:", i);
538               trace(TRACE_gc,"   copied           %ld", gc_threads[i]->copied * sizeof(W_));
539               trace(TRACE_gc,"   scanned          %ld", gc_threads[i]->scanned * sizeof(W_));
540               trace(TRACE_gc,"   any_work         %ld", gc_threads[i]->any_work);
541               trace(TRACE_gc,"   no_work          %ld", gc_threads[i]->no_work);
542               trace(TRACE_gc,"   scav_find_work %ld",   gc_threads[i]->scav_find_work);
543           }
544           copied += gc_threads[i]->copied;
545           max_copied = stg_max(gc_threads[i]->copied, max_copied);
546       }
547       if (n_gc_threads == 1) {
548           max_copied = 0;
549           avg_copied = 0;
550       } else {
551           avg_copied = copied;
552       }
553   }
554
555   for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
556
557     if (g == N) {
558       generations[g].collections++; // for stats 
559       if (n_gc_threads > 1) generations[g].par_collections++;
560     }
561
562     // Count the mutable list as bytes "copied" for the purposes of
563     // stats.  Every mutable list is copied during every GC.
564     if (g > 0) {
565         nat mut_list_size = 0;
566         for (bd = generations[g].mut_list; bd != NULL; bd = bd->link) {
567             mut_list_size += bd->free - bd->start;
568         }
569         for (n = 0; n < n_capabilities; n++) {
570             for (bd = capabilities[n].mut_lists[g]; 
571                  bd != NULL; bd = bd->link) {
572                 mut_list_size += bd->free - bd->start;
573             }
574         }
575         copied +=  mut_list_size;
576
577         debugTrace(DEBUG_gc,
578                    "mut_list_size: %lu (%d vars, %d arrays, %d MVARs, %d others)",
579                    (unsigned long)(mut_list_size * sizeof(W_)),
580                    mutlist_MUTVARS, mutlist_MUTARRS, mutlist_MVARS, mutlist_OTHERS);
581     }
582
583     for (s = 0; s < generations[g].n_steps; s++) {
584       bdescr *next, *prev;
585       stp = &generations[g].steps[s];
586
587       // for generations we collected... 
588       if (g <= N) {
589
590         /* free old memory and shift to-space into from-space for all
591          * the collected steps (except the allocation area).  These
592          * freed blocks will probaby be quickly recycled.
593          */
594         if (!(g == 0 && s == 0 && RtsFlags.GcFlags.generations > 1)) {
595             if (stp->mark)
596             {
597                 // tack the new blocks on the end of the existing blocks
598                 if (stp->old_blocks != NULL) {
599
600                     prev = NULL;
601                     for (bd = stp->old_blocks; bd != NULL; bd = next) {
602
603                         next = bd->link;
604
605                         if (!(bd->flags & BF_MARKED))
606                         {
607                             if (prev == NULL) {
608                                 stp->old_blocks = next;
609                             } else {
610                                 prev->link = next;
611                             }
612                             freeGroup(bd);
613                             stp->n_old_blocks--;
614                         }
615                         else
616                         {
617                             stp->n_words += bd->free - bd->start;
618
619                             // NB. this step might not be compacted next
620                             // time, so reset the BF_MARKED flags.
621                             // They are set before GC if we're going to
622                             // compact.  (search for BF_MARKED above).
623                             bd->flags &= ~BF_MARKED;
624                             
625                             // between GCs, all blocks in the heap except
626                             // for the nursery have the BF_EVACUATED flag set.
627                             bd->flags |= BF_EVACUATED;
628
629                             prev = bd;
630                         }
631                     }
632
633                     if (prev != NULL) {
634                         prev->link = stp->blocks;
635                         stp->blocks = stp->old_blocks;
636                     }
637                 }
638                 // add the new blocks to the block tally
639                 stp->n_blocks += stp->n_old_blocks;
640                 ASSERT(countBlocks(stp->blocks) == stp->n_blocks);
641                 ASSERT(countOccupied(stp->blocks) == stp->n_words);
642             }
643             else // not copacted
644             {
645                 freeChain(stp->old_blocks);
646             }
647             stp->old_blocks = NULL;
648             stp->n_old_blocks = 0;
649         }
650
651         /* LARGE OBJECTS.  The current live large objects are chained on
652          * scavenged_large, having been moved during garbage
653          * collection from large_objects.  Any objects left on
654          * large_objects list are therefore dead, so we free them here.
655          */
656         for (bd = stp->large_objects; bd != NULL; bd = next) {
657           next = bd->link;
658           freeGroup(bd);
659           bd = next;
660         }
661
662         stp->large_objects  = stp->scavenged_large_objects;
663         stp->n_large_blocks = stp->n_scavenged_large_blocks;
664
665       }
666       else // for older generations... 
667       {
668         /* For older generations, we need to append the
669          * scavenged_large_object list (i.e. large objects that have been
670          * promoted during this GC) to the large_object list for that step.
671          */
672         for (bd = stp->scavenged_large_objects; bd; bd = next) {
673           next = bd->link;
674           dbl_link_onto(bd, &stp->large_objects);
675         }
676
677         // add the new blocks we promoted during this GC 
678         stp->n_large_blocks += stp->n_scavenged_large_blocks;
679       }
680     }
681   }
682
683   // update the max size of older generations after a major GC
684   resize_generations();
685   
686   // Calculate the amount of live data for stats.
687   live = calcLiveWords();
688
689   // Free the small objects allocated via allocate(), since this will
690   // all have been copied into G0S1 now.  
691   if (RtsFlags.GcFlags.generations > 1) {
692       if (g0s0->blocks != NULL) {
693           freeChain(g0s0->blocks);
694           g0s0->blocks = NULL;
695       }
696       g0s0->n_blocks = 0;
697       g0s0->n_words = 0;
698   }
699   alloc_blocks = 0;
700   alloc_blocks_lim = RtsFlags.GcFlags.minAllocAreaSize;
701
702   // Start a new pinned_object_block
703   pinned_object_block = NULL;
704
705   // Free the mark stack.
706   if (mark_stack_bdescr != NULL) {
707       freeGroup(mark_stack_bdescr);
708   }
709
710   // Free any bitmaps.
711   for (g = 0; g <= N; g++) {
712       for (s = 0; s < generations[g].n_steps; s++) {
713           stp = &generations[g].steps[s];
714           if (stp->bitmap != NULL) {
715               freeGroup(stp->bitmap);
716               stp->bitmap = NULL;
717           }
718       }
719   }
720
721   resize_nursery();
722
723  // mark the garbage collected CAFs as dead 
724 #if 0 && defined(DEBUG) // doesn't work at the moment 
725   if (major_gc) { gcCAFs(); }
726 #endif
727   
728 #ifdef PROFILING
729   // resetStaticObjectForRetainerProfiling() must be called before
730   // zeroing below.
731   if (n_gc_threads > 1) {
732       barf("profiling is currently broken with multi-threaded GC");
733       // ToDo: fix the gct->scavenged_static_objects below
734   }
735   resetStaticObjectForRetainerProfiling(gct->scavenged_static_objects);
736 #endif
737
738   // zero the scavenged static object list 
739   if (major_gc) {
740       nat i;
741       for (i = 0; i < n_gc_threads; i++) {
742           zero_static_object_list(gc_threads[i]->scavenged_static_objects);
743       }
744   }
745
746   // Reset the nursery
747   resetNurseries();
748
749   // start any pending finalizers 
750   RELEASE_SM_LOCK;
751   scheduleFinalizers(cap, old_weak_ptr_list);
752   ACQUIRE_SM_LOCK;
753   
754   // send exceptions to any threads which were about to die 
755   RELEASE_SM_LOCK;
756   resurrectThreads(resurrected_threads);
757   performPendingThrowTos(exception_threads);
758   ACQUIRE_SM_LOCK;
759
760   // Update the stable pointer hash table.
761   updateStablePtrTable(major_gc);
762
763   // check sanity after GC 
764   IF_DEBUG(sanity, checkSanity());
765
766   // extra GC trace info 
767   if (traceClass(TRACE_gc|DEBUG_gc)) statDescribeGens();
768
769 #ifdef DEBUG
770   // symbol-table based profiling 
771   /*  heapCensus(to_blocks); */ /* ToDo */
772 #endif
773
774   // restore enclosing cost centre 
775 #ifdef PROFILING
776   CCCS = prev_CCS;
777 #endif
778
779 #ifdef DEBUG
780   // check for memory leaks if DEBUG is on 
781   memInventory(traceClass(DEBUG_gc));
782 #endif
783
784 #ifdef RTS_GTK_FRONTPANEL
785   if (RtsFlags.GcFlags.frontpanel) {
786       updateFrontPanelAfterGC( N, live );
787   }
788 #endif
789
790   // ok, GC over: tell the stats department what happened. 
791   slop = calcLiveBlocks() * BLOCK_SIZE_W - live;
792   stat_endGC(allocated, live, copied, N, max_copied, avg_copied, slop);
793
794   // Guess which generation we'll collect *next* time
795   initialise_N(force_major_gc);
796
797 #if defined(RTS_USER_SIGNALS)
798   if (RtsFlags.MiscFlags.install_signal_handlers) {
799     // unblock signals again
800     unblockUserSignals();
801   }
802 #endif
803
804   RELEASE_SM_LOCK;
805
806   gct = saved_gct;
807 }
808
809 /* -----------------------------------------------------------------------------
810    Figure out which generation to collect, initialise N and major_gc.
811
812    Also returns the total number of blocks in generations that will be
813    collected.
814    -------------------------------------------------------------------------- */
815
816 static nat
817 initialise_N (rtsBool force_major_gc)
818 {
819     int g;
820     nat s, blocks, blocks_total;
821
822     blocks = 0;
823     blocks_total = 0;
824
825     if (force_major_gc) {
826         N = RtsFlags.GcFlags.generations - 1;
827     } else {
828         N = 0;
829     }
830
831     for (g = RtsFlags.GcFlags.generations - 1; g >= 0; g--) {
832         blocks = 0;
833         for (s = 0; s < generations[g].n_steps; s++) {
834             blocks += generations[g].steps[s].n_words / BLOCK_SIZE_W;
835             blocks += generations[g].steps[s].n_large_blocks;
836         }
837         if (blocks >= generations[g].max_blocks) {
838             N = stg_max(N,g);
839         }
840         if ((nat)g <= N) {
841             blocks_total += blocks;
842         }
843     }
844
845     blocks_total += countNurseryBlocks();
846
847     major_gc = (N == RtsFlags.GcFlags.generations-1);
848     return blocks_total;
849 }
850
851 /* -----------------------------------------------------------------------------
852    Initialise the gc_thread structures.
853    -------------------------------------------------------------------------- */
854
855 #define GC_THREAD_INACTIVE             0
856 #define GC_THREAD_STANDING_BY          1
857 #define GC_THREAD_RUNNING              2
858 #define GC_THREAD_WAITING_TO_CONTINUE  3
859
860 static gc_thread *
861 alloc_gc_thread (int n)
862 {
863     nat s;
864     step_workspace *ws;
865     gc_thread *t;
866
867     t = stgMallocBytes(sizeof(gc_thread) + total_steps * sizeof(step_workspace),
868                        "alloc_gc_thread");
869
870 #ifdef THREADED_RTS
871     t->id = 0;
872     initSpinLock(&t->gc_spin);
873     initSpinLock(&t->mut_spin);
874     ACQUIRE_SPIN_LOCK(&t->gc_spin);
875     t->wakeup = GC_THREAD_INACTIVE;  // starts true, so we can wait for the
876                           // thread to start up, see wakeup_gc_threads
877 #endif
878
879     t->thread_index = n;
880     t->free_blocks = NULL;
881     t->gc_count = 0;
882
883     init_gc_thread(t);
884     
885 #ifdef USE_PAPI
886     t->papi_events = -1;
887 #endif
888
889     for (s = 0; s < total_steps; s++)
890     {
891         ws = &t->steps[s];
892         ws->step = &all_steps[s];
893         ASSERT(s == ws->step->abs_no);
894         ws->gct = t;
895         
896         ws->todo_bd = NULL;
897         ws->todo_q = newWSDeque(128);
898         ws->todo_overflow = NULL;
899         ws->n_todo_overflow = 0;
900         
901         ws->part_list = NULL;
902         ws->n_part_blocks = 0;
903
904         ws->scavd_list = NULL;
905         ws->n_scavd_blocks = 0;
906     }
907
908     return t;
909 }
910
911
912 void
913 initGcThreads (void)
914 {
915     if (gc_threads == NULL) {
916 #if defined(THREADED_RTS)
917         nat i;
918         gc_threads = stgMallocBytes (RtsFlags.ParFlags.nNodes * 
919                                      sizeof(gc_thread*), 
920                                      "alloc_gc_threads");
921
922         for (i = 0; i < RtsFlags.ParFlags.nNodes; i++) {
923             gc_threads[i] = alloc_gc_thread(i);
924         }
925 #else
926         gc_threads = stgMallocBytes (sizeof(gc_thread*), 
927                                      "alloc_gc_threads");
928
929         gc_threads[0] = alloc_gc_thread(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     ASSERT(n_running <= n_gc_threads);
952     return n_running;
953 }
954
955 static nat
956 dec_running (void)
957 {
958     nat n_running;
959     ACQUIRE_LOCK(&gc_running_mutex);
960     ASSERT(n_gc_threads != 0);
961     n_running = --gc_running_threads;
962     RELEASE_LOCK(&gc_running_mutex);
963     return n_running;
964 }
965
966 static rtsBool
967 any_work (void)
968 {
969     int s;
970     step_workspace *ws;
971
972     gct->any_work++;
973
974     write_barrier();
975
976     // scavenge objects in compacted generation
977     if (mark_stack_overflowed || oldgen_scan_bd != NULL ||
978         (mark_stack_bdescr != NULL && !mark_stack_empty())) {
979         return rtsTrue;
980     }
981     
982     // Check for global work in any step.  We don't need to check for
983     // local work, because we have already exited scavenge_loop(),
984     // which means there is no local work for this thread.
985     for (s = total_steps-1; s >= 0; s--) {
986         if (s == 0 && RtsFlags.GcFlags.generations > 1) { 
987             continue; 
988         }
989         ws = &gct->steps[s];
990         if (ws->todo_large_objects) return rtsTrue;
991         if (!looksEmptyWSDeque(ws->todo_q)) return rtsTrue;
992         if (ws->todo_overflow) return rtsTrue;
993     }
994
995 #if defined(THREADED_RTS)
996     if (work_stealing) {
997         nat n;
998         // look for work to steal
999         for (n = 0; n < n_gc_threads; n++) {
1000             if (n == gct->thread_index) continue;
1001             for (s = total_steps-1; s >= 0; s--) {
1002                 ws = &gc_threads[n]->steps[s];
1003                 if (!looksEmptyWSDeque(ws->todo_q)) return rtsTrue;
1004             }
1005         }
1006     }
1007 #endif
1008
1009     gct->no_work++;
1010
1011     return rtsFalse;
1012 }    
1013
1014 static void
1015 scavenge_until_all_done (void)
1016 {
1017     nat r;
1018         
1019     debugTrace(DEBUG_gc, "GC thread %d working", gct->thread_index);
1020
1021 loop:
1022 #if defined(THREADED_RTS)
1023     if (n_gc_threads > 1) {
1024         scavenge_loop();
1025     } else {
1026         scavenge_loop1();
1027     }
1028 #else
1029     scavenge_loop();
1030 #endif
1031
1032     // scavenge_loop() only exits when there's no work to do
1033     r = dec_running();
1034     
1035     debugTrace(DEBUG_gc, "GC thread %d idle (%d still running)", 
1036                gct->thread_index, r);
1037     
1038     while (gc_running_threads != 0) {
1039         // usleep(1);
1040         if (any_work()) {
1041             inc_running();
1042             goto loop;
1043         }
1044         // any_work() does not remove the work from the queue, it
1045         // just checks for the presence of work.  If we find any,
1046         // then we increment gc_running_threads and go back to 
1047         // scavenge_loop() to perform any pending work.
1048     }
1049     
1050     // All threads are now stopped
1051     debugTrace(DEBUG_gc, "GC thread %d finished.", gct->thread_index);
1052 }
1053
1054 #if defined(THREADED_RTS)
1055
1056 void
1057 gcWorkerThread (Capability *cap)
1058 {
1059     cap->in_gc = rtsTrue;
1060
1061     gct = gc_threads[cap->no];
1062     gct->id = osThreadId();
1063
1064     // Wait until we're told to wake up
1065     RELEASE_SPIN_LOCK(&gct->mut_spin);
1066     gct->wakeup = GC_THREAD_STANDING_BY;
1067     debugTrace(DEBUG_gc, "GC thread %d standing by...", gct->thread_index);
1068     ACQUIRE_SPIN_LOCK(&gct->gc_spin);
1069     
1070 #ifdef USE_PAPI
1071     // start performance counters in this thread...
1072     if (gct->papi_events == -1) {
1073         papi_init_eventset(&gct->papi_events);
1074     }
1075     papi_thread_start_gc1_count(gct->papi_events);
1076 #endif
1077     
1078     // Every thread evacuates some roots.
1079     gct->evac_step = 0;
1080     markSomeCapabilities(mark_root, gct, gct->thread_index, n_gc_threads,
1081                          rtsTrue/*prune sparks*/);
1082     scavenge_capability_mut_lists(&capabilities[gct->thread_index]);
1083
1084     scavenge_until_all_done();
1085     
1086 #ifdef USE_PAPI
1087     // count events in this thread towards the GC totals
1088     papi_thread_stop_gc1_count(gct->papi_events);
1089 #endif
1090
1091     // Wait until we're told to continue
1092     RELEASE_SPIN_LOCK(&gct->gc_spin);
1093     gct->wakeup = GC_THREAD_WAITING_TO_CONTINUE;
1094     debugTrace(DEBUG_gc, "GC thread %d waiting to continue...", 
1095                gct->thread_index);
1096     ACQUIRE_SPIN_LOCK(&gct->mut_spin);
1097     debugTrace(DEBUG_gc, "GC thread %d on my way...", gct->thread_index);
1098 }
1099
1100 #endif
1101
1102 void
1103 waitForGcThreads (Capability *cap USED_IF_THREADS)
1104 {
1105 #if defined(THREADED_RTS)
1106     nat n_threads = RtsFlags.ParFlags.nNodes;
1107     nat me = cap->no;
1108     nat i, j;
1109     rtsBool retry = rtsTrue;
1110
1111     while(retry) {
1112         for (i=0; i < n_threads; i++) {
1113             if (i == me) continue;
1114             if (gc_threads[i]->wakeup != GC_THREAD_STANDING_BY) {
1115                 prodCapability(&capabilities[i], cap->running_task);
1116             }
1117         }
1118         for (j=0; j < 10000000; j++) {
1119             retry = rtsFalse;
1120             for (i=0; i < n_threads; i++) {
1121                 if (i == me) continue;
1122                 write_barrier();
1123                 setContextSwitches();
1124                 if (gc_threads[i]->wakeup != GC_THREAD_STANDING_BY) {
1125                     retry = rtsTrue;
1126                 }
1127             }
1128             if (!retry) break;
1129         }
1130     }
1131 #endif
1132 }
1133
1134 static void
1135 start_gc_threads (void)
1136 {
1137 #if defined(THREADED_RTS)
1138     gc_running_threads = 0;
1139     initMutex(&gc_running_mutex);
1140 #endif
1141 }
1142
1143 static void
1144 wakeup_gc_threads (nat n_threads USED_IF_THREADS, nat me USED_IF_THREADS)
1145 {
1146 #if defined(THREADED_RTS)
1147     nat i;
1148     for (i=0; i < n_threads; i++) {
1149         if (i == me) continue;
1150         inc_running();
1151         debugTrace(DEBUG_gc, "waking up gc thread %d", i);
1152         if (gc_threads[i]->wakeup != GC_THREAD_STANDING_BY) barf("wakeup_gc_threads");
1153
1154         gc_threads[i]->wakeup = GC_THREAD_RUNNING;
1155         ACQUIRE_SPIN_LOCK(&gc_threads[i]->mut_spin);
1156         RELEASE_SPIN_LOCK(&gc_threads[i]->gc_spin);
1157     }
1158 #endif
1159 }
1160
1161 // After GC is complete, we must wait for all GC threads to enter the
1162 // standby state, otherwise they may still be executing inside
1163 // any_work(), and may even remain awake until the next GC starts.
1164 static void
1165 shutdown_gc_threads (nat n_threads USED_IF_THREADS, nat me USED_IF_THREADS)
1166 {
1167 #if defined(THREADED_RTS)
1168     nat i;
1169     for (i=0; i < n_threads; i++) {
1170         if (i == me) continue;
1171         while (gc_threads[i]->wakeup != GC_THREAD_WAITING_TO_CONTINUE) { write_barrier(); }
1172     }
1173 #endif
1174 }
1175
1176 void
1177 releaseGCThreads (Capability *cap USED_IF_THREADS)
1178 {
1179 #if defined(THREADED_RTS)
1180     nat n_threads = RtsFlags.ParFlags.nNodes;
1181     nat me = cap->no;
1182     nat i;
1183     for (i=0; i < n_threads; i++) {
1184         if (i == me) continue;
1185         if (gc_threads[i]->wakeup != GC_THREAD_WAITING_TO_CONTINUE) 
1186             barf("releaseGCThreads");
1187         
1188         gc_threads[i]->wakeup = GC_THREAD_INACTIVE;
1189         ACQUIRE_SPIN_LOCK(&gc_threads[i]->gc_spin);
1190         RELEASE_SPIN_LOCK(&gc_threads[i]->mut_spin);
1191     }
1192 #endif
1193 }
1194
1195 /* ----------------------------------------------------------------------------
1196    Initialise a generation that is to be collected 
1197    ------------------------------------------------------------------------- */
1198
1199 static void
1200 init_collected_gen (nat g, nat n_threads)
1201 {
1202     nat s, t, i;
1203     step_workspace *ws;
1204     step *stp;
1205     bdescr *bd;
1206
1207     // Throw away the current mutable list.  Invariant: the mutable
1208     // list always has at least one block; this means we can avoid a
1209     // check for NULL in recordMutable().
1210     if (g != 0) {
1211         freeChain(generations[g].mut_list);
1212         generations[g].mut_list = allocBlock();
1213         for (i = 0; i < n_capabilities; i++) {
1214             freeChain(capabilities[i].mut_lists[g]);
1215             capabilities[i].mut_lists[g] = allocBlock();
1216         }
1217     }
1218
1219     for (s = 0; s < generations[g].n_steps; s++) {
1220
1221         stp = &generations[g].steps[s];
1222         ASSERT(stp->gen_no == g);
1223
1224         // we'll construct a new list of threads in this step
1225         // during GC, throw away the current list.
1226         stp->old_threads = stp->threads;
1227         stp->threads = END_TSO_QUEUE;
1228
1229         // generation 0, step 0 doesn't need to-space 
1230         if (g == 0 && s == 0 && RtsFlags.GcFlags.generations > 1) { 
1231             continue; 
1232         }
1233         
1234         // deprecate the existing blocks
1235         stp->old_blocks   = stp->blocks;
1236         stp->n_old_blocks = stp->n_blocks;
1237         stp->blocks       = NULL;
1238         stp->n_blocks     = 0;
1239         stp->n_words      = 0;
1240         stp->live_estimate = 0;
1241
1242         // initialise the large object queues.
1243         stp->scavenged_large_objects = NULL;
1244         stp->n_scavenged_large_blocks = 0;
1245
1246         // mark the small objects as from-space
1247         for (bd = stp->old_blocks; bd; bd = bd->link) {
1248             bd->flags &= ~BF_EVACUATED;
1249         }
1250
1251         // mark the large objects as from-space
1252         for (bd = stp->large_objects; bd; bd = bd->link) {
1253             bd->flags &= ~BF_EVACUATED;
1254         }
1255
1256         // for a compacted step, we need to allocate the bitmap
1257         if (stp->mark) {
1258             nat bitmap_size; // in bytes
1259             bdescr *bitmap_bdescr;
1260             StgWord *bitmap;
1261             
1262             bitmap_size = stp->n_old_blocks * BLOCK_SIZE / (sizeof(W_)*BITS_PER_BYTE);
1263             
1264             if (bitmap_size > 0) {
1265                 bitmap_bdescr = allocGroup((lnat)BLOCK_ROUND_UP(bitmap_size) 
1266                                            / BLOCK_SIZE);
1267                 stp->bitmap = bitmap_bdescr;
1268                 bitmap = bitmap_bdescr->start;
1269                 
1270                 debugTrace(DEBUG_gc, "bitmap_size: %d, bitmap: %p",
1271                            bitmap_size, bitmap);
1272                 
1273                 // don't forget to fill it with zeros!
1274                 memset(bitmap, 0, bitmap_size);
1275                 
1276                 // For each block in this step, point to its bitmap from the
1277                 // block descriptor.
1278                 for (bd=stp->old_blocks; bd != NULL; bd = bd->link) {
1279                     bd->u.bitmap = bitmap;
1280                     bitmap += BLOCK_SIZE_W / (sizeof(W_)*BITS_PER_BYTE);
1281                     
1282                     // Also at this point we set the BF_MARKED flag
1283                     // for this block.  The invariant is that
1284                     // BF_MARKED is always unset, except during GC
1285                     // when it is set on those blocks which will be
1286                     // compacted.
1287                     if (!(bd->flags & BF_FRAGMENTED)) {
1288                         bd->flags |= BF_MARKED;
1289                     }
1290                 }
1291             }
1292         }
1293     }
1294
1295     // For each GC thread, for each step, allocate a "todo" block to
1296     // store evacuated objects to be scavenged, and a block to store
1297     // evacuated objects that do not need to be scavenged.
1298     for (t = 0; t < n_threads; t++) {
1299         for (s = 0; s < generations[g].n_steps; s++) {
1300
1301             // we don't copy objects into g0s0, unless -G0
1302             if (g==0 && s==0 && RtsFlags.GcFlags.generations > 1) continue;
1303
1304             ws = &gc_threads[t]->steps[g * RtsFlags.GcFlags.steps + s];
1305
1306             ws->todo_large_objects = NULL;
1307
1308             ws->part_list = NULL;
1309             ws->n_part_blocks = 0;
1310
1311             // allocate the first to-space block; extra blocks will be
1312             // chained on as necessary.
1313             ws->todo_bd = NULL;
1314             ASSERT(looksEmptyWSDeque(ws->todo_q));
1315             alloc_todo_block(ws,0);
1316
1317             ws->todo_overflow = NULL;
1318             ws->n_todo_overflow = 0;
1319
1320             ws->scavd_list = NULL;
1321             ws->n_scavd_blocks = 0;
1322         }
1323     }
1324 }
1325
1326
1327 /* ----------------------------------------------------------------------------
1328    Initialise a generation that is *not* to be collected 
1329    ------------------------------------------------------------------------- */
1330
1331 static void
1332 init_uncollected_gen (nat g, nat threads)
1333 {
1334     nat s, t, n;
1335     step_workspace *ws;
1336     step *stp;
1337     bdescr *bd;
1338
1339     // save the current mutable lists for this generation, and
1340     // allocate a fresh block for each one.  We'll traverse these
1341     // mutable lists as roots early on in the GC.
1342     generations[g].saved_mut_list = generations[g].mut_list;
1343     generations[g].mut_list = allocBlock(); 
1344     for (n = 0; n < n_capabilities; n++) {
1345         capabilities[n].saved_mut_lists[g] = capabilities[n].mut_lists[g];
1346         capabilities[n].mut_lists[g] = allocBlock();
1347     }
1348
1349     for (s = 0; s < generations[g].n_steps; s++) {
1350         stp = &generations[g].steps[s];
1351         stp->scavenged_large_objects = NULL;
1352         stp->n_scavenged_large_blocks = 0;
1353     }
1354     
1355     for (s = 0; s < generations[g].n_steps; s++) {
1356             
1357         stp = &generations[g].steps[s];
1358
1359         for (t = 0; t < threads; t++) {
1360             ws = &gc_threads[t]->steps[g * RtsFlags.GcFlags.steps + s];
1361             
1362             ASSERT(looksEmptyWSDeque(ws->todo_q));
1363             ws->todo_large_objects = NULL;
1364
1365             ws->part_list = NULL;
1366             ws->n_part_blocks = 0;
1367
1368             ws->scavd_list = NULL;
1369             ws->n_scavd_blocks = 0;
1370
1371             // If the block at the head of the list in this generation
1372             // is less than 3/4 full, then use it as a todo block.
1373             if (stp->blocks && isPartiallyFull(stp->blocks))
1374             {
1375                 ws->todo_bd = stp->blocks;
1376                 ws->todo_free = ws->todo_bd->free;
1377                 ws->todo_lim = ws->todo_bd->start + BLOCK_SIZE_W;
1378                 stp->blocks = stp->blocks->link;
1379                 stp->n_blocks -= 1;
1380                 stp->n_words -= ws->todo_bd->free - ws->todo_bd->start;
1381                 ws->todo_bd->link = NULL;
1382                 // we must scan from the current end point.
1383                 ws->todo_bd->u.scan = ws->todo_bd->free;
1384             } 
1385             else
1386             {
1387                 ws->todo_bd = NULL;
1388                 alloc_todo_block(ws,0);
1389             }
1390         }
1391
1392         // deal out any more partial blocks to the threads' part_lists
1393         t = 0;
1394         while (stp->blocks && isPartiallyFull(stp->blocks))
1395         {
1396             bd = stp->blocks;
1397             stp->blocks = bd->link;
1398             ws = &gc_threads[t]->steps[g * RtsFlags.GcFlags.steps + s];
1399             bd->link = ws->part_list;
1400             ws->part_list = bd;
1401             ws->n_part_blocks += 1;
1402             bd->u.scan = bd->free;
1403             stp->n_blocks -= 1;
1404             stp->n_words -= bd->free - bd->start;
1405             t++;
1406             if (t == n_gc_threads) t = 0;
1407         }
1408     }
1409 }
1410
1411 /* -----------------------------------------------------------------------------
1412    Initialise a gc_thread before GC
1413    -------------------------------------------------------------------------- */
1414
1415 static void
1416 init_gc_thread (gc_thread *t)
1417 {
1418     t->static_objects = END_OF_STATIC_LIST;
1419     t->scavenged_static_objects = END_OF_STATIC_LIST;
1420     t->scan_bd = NULL;
1421     t->mut_lists = capabilities[t->thread_index].mut_lists;
1422     t->evac_step = 0;
1423     t->failed_to_evac = rtsFalse;
1424     t->eager_promotion = rtsTrue;
1425     t->thunk_selector_depth = 0;
1426     t->copied = 0;
1427     t->scanned = 0;
1428     t->any_work = 0;
1429     t->no_work = 0;
1430     t->scav_find_work = 0;
1431 }
1432
1433 /* -----------------------------------------------------------------------------
1434    Function we pass to evacuate roots.
1435    -------------------------------------------------------------------------- */
1436
1437 static void
1438 mark_root(void *user, StgClosure **root)
1439 {
1440     // we stole a register for gct, but this function is called from
1441     // *outside* the GC where the register variable is not in effect,
1442     // so we need to save and restore it here.  NB. only call
1443     // mark_root() from the main GC thread, otherwise gct will be
1444     // incorrect.
1445     gc_thread *saved_gct;
1446     saved_gct = gct;
1447     gct = user;
1448     
1449     evacuate(root);
1450     
1451     gct = saved_gct;
1452 }
1453
1454 /* -----------------------------------------------------------------------------
1455    Initialising the static object & mutable lists
1456    -------------------------------------------------------------------------- */
1457
1458 static void
1459 zero_static_object_list(StgClosure* first_static)
1460 {
1461   StgClosure* p;
1462   StgClosure* link;
1463   const StgInfoTable *info;
1464
1465   for (p = first_static; p != END_OF_STATIC_LIST; p = link) {
1466     info = get_itbl(p);
1467     link = *STATIC_LINK(info, p);
1468     *STATIC_LINK(info,p) = NULL;
1469   }
1470 }
1471
1472 /* ----------------------------------------------------------------------------
1473    Update the pointers from the task list
1474
1475    These are treated as weak pointers because we want to allow a main
1476    thread to get a BlockedOnDeadMVar exception in the same way as any
1477    other thread.  Note that the threads should all have been retained
1478    by GC by virtue of being on the all_threads list, we're just
1479    updating pointers here.
1480    ------------------------------------------------------------------------- */
1481
1482 static void
1483 update_task_list (void)
1484 {
1485     Task *task;
1486     StgTSO *tso;
1487     for (task = all_tasks; task != NULL; task = task->all_link) {
1488         if (!task->stopped && task->tso) {
1489             ASSERT(task->tso->bound == task);
1490             tso = (StgTSO *) isAlive((StgClosure *)task->tso);
1491             if (tso == NULL) {
1492                 barf("task %p: main thread %d has been GC'd", 
1493 #ifdef THREADED_RTS
1494                      (void *)task->id, 
1495 #else
1496                      (void *)task,
1497 #endif
1498                      task->tso->id);
1499             }
1500             task->tso = tso;
1501         }
1502     }
1503 }
1504
1505 /* ----------------------------------------------------------------------------
1506    Reset the sizes of the older generations when we do a major
1507    collection.
1508   
1509    CURRENT STRATEGY: make all generations except zero the same size.
1510    We have to stay within the maximum heap size, and leave a certain
1511    percentage of the maximum heap size available to allocate into.
1512    ------------------------------------------------------------------------- */
1513
1514 static void
1515 resize_generations (void)
1516 {
1517     nat g;
1518
1519     if (major_gc && RtsFlags.GcFlags.generations > 1) {
1520         nat live, size, min_alloc, words;
1521         nat max  = RtsFlags.GcFlags.maxHeapSize;
1522         nat gens = RtsFlags.GcFlags.generations;
1523         
1524         // live in the oldest generations
1525         if (oldest_gen->steps[0].live_estimate != 0) {
1526             words = oldest_gen->steps[0].live_estimate;
1527         } else {
1528             words = oldest_gen->steps[0].n_words;
1529         }
1530         live = (words + BLOCK_SIZE_W - 1) / BLOCK_SIZE_W +
1531             oldest_gen->steps[0].n_large_blocks;
1532         
1533         // default max size for all generations except zero
1534         size = stg_max(live * RtsFlags.GcFlags.oldGenFactor,
1535                        RtsFlags.GcFlags.minOldGenSize);
1536         
1537         // minimum size for generation zero
1538         min_alloc = stg_max((RtsFlags.GcFlags.pcFreeHeap * max) / 200,
1539                             RtsFlags.GcFlags.minAllocAreaSize);
1540
1541         // Auto-enable compaction when the residency reaches a
1542         // certain percentage of the maximum heap size (default: 30%).
1543         if (RtsFlags.GcFlags.generations > 1 &&
1544             (RtsFlags.GcFlags.compact ||
1545              (max > 0 &&
1546               oldest_gen->steps[0].n_blocks > 
1547               (RtsFlags.GcFlags.compactThreshold * max) / 100))) {
1548             oldest_gen->steps[0].mark = 1;
1549             oldest_gen->steps[0].compact = 1;
1550 //        debugBelch("compaction: on\n", live);
1551         } else {
1552             oldest_gen->steps[0].mark = 0;
1553             oldest_gen->steps[0].compact = 0;
1554 //        debugBelch("compaction: off\n", live);
1555         }
1556
1557         if (RtsFlags.GcFlags.sweep) {
1558             oldest_gen->steps[0].mark = 1;
1559         }
1560
1561         // if we're going to go over the maximum heap size, reduce the
1562         // size of the generations accordingly.  The calculation is
1563         // different if compaction is turned on, because we don't need
1564         // to double the space required to collect the old generation.
1565         if (max != 0) {
1566             
1567             // this test is necessary to ensure that the calculations
1568             // below don't have any negative results - we're working
1569             // with unsigned values here.
1570             if (max < min_alloc) {
1571                 heapOverflow();
1572             }
1573             
1574             if (oldest_gen->steps[0].compact) {
1575                 if ( (size + (size - 1) * (gens - 2) * 2) + min_alloc > max ) {
1576                     size = (max - min_alloc) / ((gens - 1) * 2 - 1);
1577                 }
1578             } else {
1579                 if ( (size * (gens - 1) * 2) + min_alloc > max ) {
1580                     size = (max - min_alloc) / ((gens - 1) * 2);
1581                 }
1582             }
1583             
1584             if (size < live) {
1585                 heapOverflow();
1586             }
1587         }
1588         
1589 #if 0
1590         debugBelch("live: %d, min_alloc: %d, size : %d, max = %d\n", live,
1591                    min_alloc, size, max);
1592 #endif
1593         
1594         for (g = 0; g < gens; g++) {
1595             generations[g].max_blocks = size;
1596         }
1597     }
1598 }
1599
1600 /* -----------------------------------------------------------------------------
1601    Calculate the new size of the nursery, and resize it.
1602    -------------------------------------------------------------------------- */
1603
1604 static void
1605 resize_nursery (void)
1606 {
1607     if (RtsFlags.GcFlags.generations == 1)
1608     {   // Two-space collector:
1609         nat blocks;
1610     
1611         /* set up a new nursery.  Allocate a nursery size based on a
1612          * function of the amount of live data (by default a factor of 2)
1613          * Use the blocks from the old nursery if possible, freeing up any
1614          * left over blocks.
1615          *
1616          * If we get near the maximum heap size, then adjust our nursery
1617          * size accordingly.  If the nursery is the same size as the live
1618          * data (L), then we need 3L bytes.  We can reduce the size of the
1619          * nursery to bring the required memory down near 2L bytes.
1620          * 
1621          * A normal 2-space collector would need 4L bytes to give the same
1622          * performance we get from 3L bytes, reducing to the same
1623          * performance at 2L bytes.
1624          */
1625         blocks = g0s0->n_blocks;
1626         
1627         if ( RtsFlags.GcFlags.maxHeapSize != 0 &&
1628              blocks * RtsFlags.GcFlags.oldGenFactor * 2 > 
1629              RtsFlags.GcFlags.maxHeapSize )
1630         {
1631             long adjusted_blocks;  // signed on purpose 
1632             int pc_free; 
1633             
1634             adjusted_blocks = (RtsFlags.GcFlags.maxHeapSize - 2 * blocks);
1635             
1636             debugTrace(DEBUG_gc, "near maximum heap size of 0x%x blocks, blocks = %d, adjusted to %ld", 
1637                        RtsFlags.GcFlags.maxHeapSize, blocks, adjusted_blocks);
1638             
1639             pc_free = adjusted_blocks * 100 / RtsFlags.GcFlags.maxHeapSize;
1640             if (pc_free < RtsFlags.GcFlags.pcFreeHeap) /* might even * be < 0 */
1641             {
1642                 heapOverflow();
1643             }
1644             blocks = adjusted_blocks;
1645         }
1646         else
1647         {
1648             blocks *= RtsFlags.GcFlags.oldGenFactor;
1649             if (blocks < RtsFlags.GcFlags.minAllocAreaSize)
1650             {
1651                 blocks = RtsFlags.GcFlags.minAllocAreaSize;
1652             }
1653         }
1654         resizeNurseries(blocks);
1655     }
1656     else  // Generational collector
1657     {
1658         /* 
1659          * If the user has given us a suggested heap size, adjust our
1660          * allocation area to make best use of the memory available.
1661          */
1662         if (RtsFlags.GcFlags.heapSizeSuggestion)
1663         {
1664             long blocks;
1665             nat needed = calcNeeded();  // approx blocks needed at next GC 
1666             
1667             /* Guess how much will be live in generation 0 step 0 next time.
1668              * A good approximation is obtained by finding the
1669              * percentage of g0s0 that was live at the last minor GC.
1670              *
1671              * We have an accurate figure for the amount of copied data in
1672              * 'copied', but we must convert this to a number of blocks, with
1673              * a small adjustment for estimated slop at the end of a block
1674              * (- 10 words).
1675              */
1676             if (N == 0)
1677             {
1678                 g0s0_pcnt_kept = ((copied / (BLOCK_SIZE_W - 10)) * 100)
1679                     / countNurseryBlocks();
1680             }
1681             
1682             /* Estimate a size for the allocation area based on the
1683              * information available.  We might end up going slightly under
1684              * or over the suggested heap size, but we should be pretty
1685              * close on average.
1686              *
1687              * Formula:            suggested - needed
1688              *                ----------------------------
1689              *                    1 + g0s0_pcnt_kept/100
1690              *
1691              * where 'needed' is the amount of memory needed at the next
1692              * collection for collecting all steps except g0s0.
1693              */
1694             blocks = 
1695                 (((long)RtsFlags.GcFlags.heapSizeSuggestion - (long)needed) * 100) /
1696                 (100 + (long)g0s0_pcnt_kept);
1697             
1698             if (blocks < (long)RtsFlags.GcFlags.minAllocAreaSize) {
1699                 blocks = RtsFlags.GcFlags.minAllocAreaSize;
1700             }
1701             
1702             resizeNurseries((nat)blocks);
1703         }
1704         else
1705         {
1706             // we might have added extra large blocks to the nursery, so
1707             // resize back to minAllocAreaSize again.
1708             resizeNurseriesFixed(RtsFlags.GcFlags.minAllocAreaSize);
1709         }
1710     }
1711 }
1712
1713 /* -----------------------------------------------------------------------------
1714    Sanity code for CAF garbage collection.
1715
1716    With DEBUG turned on, we manage a CAF list in addition to the SRT
1717    mechanism.  After GC, we run down the CAF list and blackhole any
1718    CAFs which have been garbage collected.  This means we get an error
1719    whenever the program tries to enter a garbage collected CAF.
1720
1721    Any garbage collected CAFs are taken off the CAF list at the same
1722    time. 
1723    -------------------------------------------------------------------------- */
1724
1725 #if 0 && defined(DEBUG)
1726
1727 static void
1728 gcCAFs(void)
1729 {
1730   StgClosure*  p;
1731   StgClosure** pp;
1732   const StgInfoTable *info;
1733   nat i;
1734
1735   i = 0;
1736   p = caf_list;
1737   pp = &caf_list;
1738
1739   while (p != NULL) {
1740     
1741     info = get_itbl(p);
1742
1743     ASSERT(info->type == IND_STATIC);
1744
1745     if (STATIC_LINK(info,p) == NULL) {
1746         debugTrace(DEBUG_gccafs, "CAF gc'd at 0x%04lx", (long)p);
1747         // black hole it 
1748         SET_INFO(p,&stg_BLACKHOLE_info);
1749         p = STATIC_LINK2(info,p);
1750         *pp = p;
1751     }
1752     else {
1753       pp = &STATIC_LINK2(info,p);
1754       p = *pp;
1755       i++;
1756     }
1757
1758   }
1759
1760   debugTrace(DEBUG_gccafs, "%d CAFs live", i); 
1761 }
1762 #endif