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