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