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