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