Keep the remembered sets local to each thread during parallel GC
[ghc-hetmet.git] / rts / sm / Storage.c
1 /* -----------------------------------------------------------------------------
2  *
3  * (c) The GHC Team, 1998-2008
4  *
5  * Storage manager front end
6  *
7  * Documentation on the architecture of the Storage Manager can be
8  * found in the online commentary:
9  * 
10  *   http://hackage.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage
11  *
12  * ---------------------------------------------------------------------------*/
13
14 #include "PosixSource.h"
15 #include "Rts.h"
16 #include "RtsUtils.h"
17 #include "RtsFlags.h"
18 #include "Stats.h"
19 #include "Hooks.h"
20 #include "BlockAlloc.h"
21 #include "MBlock.h"
22 #include "Weak.h"
23 #include "Sanity.h"
24 #include "Arena.h"
25 #include "OSThreads.h"
26 #include "Capability.h"
27 #include "Storage.h"
28 #include "Schedule.h"
29 #include "RetainerProfile.h"    // for counting memory blocks (memInventory)
30 #include "OSMem.h"
31 #include "Trace.h"
32 #include "GC.h"
33 #include "Evac.h"
34
35 #include <stdlib.h>
36 #include <string.h>
37
38 #include "ffi.h"
39
40 /* 
41  * All these globals require sm_mutex to access in THREADED_RTS mode.
42  */
43 StgClosure    *caf_list         = NULL;
44 StgClosure    *revertible_caf_list = NULL;
45 rtsBool       keepCAFs;
46
47 bdescr *pinned_object_block;    /* allocate pinned objects into this block */
48 nat alloc_blocks;               /* number of allocate()d blocks since GC */
49 nat alloc_blocks_lim;           /* approximate limit on alloc_blocks */
50
51 static bdescr *exec_block;
52
53 generation *generations = NULL; /* all the generations */
54 generation *g0          = NULL; /* generation 0, for convenience */
55 generation *oldest_gen  = NULL; /* oldest generation, for convenience */
56 step *g0s0              = NULL; /* generation 0, step 0, for convenience */
57
58 nat total_steps         = 0;
59 step *all_steps         = NULL; /* single array of steps */
60
61 ullong total_allocated = 0;     /* total memory allocated during run */
62
63 nat n_nurseries         = 0;    /* == RtsFlags.ParFlags.nNodes, convenience */
64 step *nurseries         = NULL; /* array of nurseries, >1 only if THREADED_RTS */
65
66 #ifdef THREADED_RTS
67 /*
68  * Storage manager mutex:  protects all the above state from
69  * simultaneous access by two STG threads.
70  */
71 Mutex sm_mutex;
72 /*
73  * This mutex is used by atomicModifyMutVar# only
74  */
75 Mutex atomic_modify_mutvar_mutex;
76 #endif
77
78
79 /*
80  * Forward references
81  */
82 static void *stgAllocForGMP   (size_t size_in_bytes);
83 static void *stgReallocForGMP (void *ptr, size_t old_size, size_t new_size);
84 static void  stgDeallocForGMP (void *ptr, size_t size);
85
86 static void
87 initStep (step *stp, int g, int s)
88 {
89     stp->no = s;
90     stp->abs_no = RtsFlags.GcFlags.steps * g + s;
91     stp->blocks = NULL;
92     stp->n_blocks = 0;
93     stp->n_words = 0;
94     stp->live_estimate = 0;
95     stp->old_blocks = NULL;
96     stp->n_old_blocks = 0;
97     stp->gen = &generations[g];
98     stp->gen_no = g;
99     stp->large_objects = NULL;
100     stp->n_large_blocks = 0;
101     stp->scavenged_large_objects = NULL;
102     stp->n_scavenged_large_blocks = 0;
103     stp->mark = 0;
104     stp->compact = 0;
105     stp->bitmap = NULL;
106 #ifdef THREADED_RTS
107     initSpinLock(&stp->sync_todo);
108     initSpinLock(&stp->sync_large_objects);
109 #endif
110     stp->threads = END_TSO_QUEUE;
111     stp->old_threads = END_TSO_QUEUE;
112 }
113
114 void
115 initStorage( void )
116 {
117   nat g, s;
118   generation *gen;
119
120   if (generations != NULL) {
121       // multi-init protection
122       return;
123   }
124
125   initMBlocks();
126
127   /* Sanity check to make sure the LOOKS_LIKE_ macros appear to be
128    * doing something reasonable.
129    */
130   /* We use the NOT_NULL variant or gcc warns that the test is always true */
131   ASSERT(LOOKS_LIKE_INFO_PTR_NOT_NULL((StgWord)&stg_BLACKHOLE_info));
132   ASSERT(LOOKS_LIKE_CLOSURE_PTR(&stg_dummy_ret_closure));
133   ASSERT(!HEAP_ALLOCED(&stg_dummy_ret_closure));
134   
135   if (RtsFlags.GcFlags.maxHeapSize != 0 &&
136       RtsFlags.GcFlags.heapSizeSuggestion > 
137       RtsFlags.GcFlags.maxHeapSize) {
138     RtsFlags.GcFlags.maxHeapSize = RtsFlags.GcFlags.heapSizeSuggestion;
139   }
140
141   if (RtsFlags.GcFlags.maxHeapSize != 0 &&
142       RtsFlags.GcFlags.minAllocAreaSize > 
143       RtsFlags.GcFlags.maxHeapSize) {
144       errorBelch("maximum heap size (-M) is smaller than minimum alloc area size (-A)");
145       RtsFlags.GcFlags.minAllocAreaSize = RtsFlags.GcFlags.maxHeapSize;
146   }
147
148   initBlockAllocator();
149   
150 #if defined(THREADED_RTS)
151   initMutex(&sm_mutex);
152   initMutex(&atomic_modify_mutvar_mutex);
153 #endif
154
155   ACQUIRE_SM_LOCK;
156
157   /* allocate generation info array */
158   generations = (generation *)stgMallocBytes(RtsFlags.GcFlags.generations 
159                                              * sizeof(struct generation_),
160                                              "initStorage: gens");
161
162   /* allocate all the steps into an array.  It is important that we do
163      it this way, because we need the invariant that two step pointers
164      can be directly compared to see which is the oldest.
165      Remember that the last generation has only one step. */
166   total_steps = 1 + (RtsFlags.GcFlags.generations - 1) * RtsFlags.GcFlags.steps;
167   all_steps   = stgMallocBytes(total_steps * sizeof(struct step_),
168                                "initStorage: steps");
169
170   /* Initialise all generations */
171   for(g = 0; g < RtsFlags.GcFlags.generations; g++) {
172     gen = &generations[g];
173     gen->no = g;
174     gen->mut_list = allocBlock();
175     gen->collections = 0;
176     gen->par_collections = 0;
177     gen->failed_promotions = 0;
178     gen->max_blocks = 0;
179   }
180
181   /* A couple of convenience pointers */
182   g0 = &generations[0];
183   oldest_gen = &generations[RtsFlags.GcFlags.generations-1];
184
185   /* Allocate step structures in each generation */
186   if (RtsFlags.GcFlags.generations > 1) {
187     /* Only for multiple-generations */
188
189     /* Oldest generation: one step */
190     oldest_gen->n_steps = 1;
191     oldest_gen->steps   = all_steps + (RtsFlags.GcFlags.generations - 1)
192                                       * RtsFlags.GcFlags.steps;
193
194     /* set up all except the oldest generation with 2 steps */
195     for(g = 0; g < RtsFlags.GcFlags.generations-1; g++) {
196       generations[g].n_steps = RtsFlags.GcFlags.steps;
197       generations[g].steps   = all_steps + g * RtsFlags.GcFlags.steps;
198     }
199     
200   } else {
201     /* single generation, i.e. a two-space collector */
202     g0->n_steps = 1;
203     g0->steps   = all_steps;
204   }
205
206 #ifdef THREADED_RTS
207   n_nurseries = n_capabilities;
208 #else
209   n_nurseries = 1;
210 #endif
211   nurseries = stgMallocBytes (n_nurseries * sizeof(struct step_),
212                               "initStorage: nurseries");
213
214   /* Initialise all steps */
215   for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
216     for (s = 0; s < generations[g].n_steps; s++) {
217         initStep(&generations[g].steps[s], g, s);
218     }
219   }
220   
221   for (s = 0; s < n_nurseries; s++) {
222       initStep(&nurseries[s], 0, s);
223   }
224   
225   /* Set up the destination pointers in each younger gen. step */
226   for (g = 0; g < RtsFlags.GcFlags.generations-1; g++) {
227     for (s = 0; s < generations[g].n_steps-1; s++) {
228       generations[g].steps[s].to = &generations[g].steps[s+1];
229     }
230     generations[g].steps[s].to = &generations[g+1].steps[0];
231   }
232   oldest_gen->steps[0].to = &oldest_gen->steps[0];
233   
234   for (s = 0; s < n_nurseries; s++) {
235       nurseries[s].to = generations[0].steps[0].to;
236   }
237   
238   /* The oldest generation has one step. */
239   if (RtsFlags.GcFlags.compact || RtsFlags.GcFlags.sweep) {
240       if (RtsFlags.GcFlags.generations == 1) {
241           errorBelch("WARNING: compact/sweep is incompatible with -G1; disabled");
242       } else {
243           oldest_gen->steps[0].mark = 1;
244           if (RtsFlags.GcFlags.compact)
245               oldest_gen->steps[0].compact = 1;
246       }
247   }
248
249   generations[0].max_blocks = 0;
250   g0s0 = &generations[0].steps[0];
251
252   /* The allocation area.  Policy: keep the allocation area
253    * small to begin with, even if we have a large suggested heap
254    * size.  Reason: we're going to do a major collection first, and we
255    * don't want it to be a big one.  This vague idea is borne out by 
256    * rigorous experimental evidence.
257    */
258   allocNurseries();
259
260   weak_ptr_list = NULL;
261   caf_list = NULL;
262   revertible_caf_list = NULL;
263    
264   /* initialise the allocate() interface */
265   alloc_blocks = 0;
266   alloc_blocks_lim = RtsFlags.GcFlags.minAllocAreaSize;
267
268   exec_block = NULL;
269
270   /* Tell GNU multi-precision pkg about our custom alloc functions */
271   mp_set_memory_functions(stgAllocForGMP, stgReallocForGMP, stgDeallocForGMP);
272
273 #ifdef THREADED_RTS
274   initSpinLock(&gc_alloc_block_sync);
275   whitehole_spin = 0;
276 #endif
277
278   N = 0;
279
280   initGcThreads();
281
282   IF_DEBUG(gc, statDescribeGens());
283
284   RELEASE_SM_LOCK;
285 }
286
287 void
288 exitStorage (void)
289 {
290     stat_exit(calcAllocated());
291 }
292
293 void
294 freeStorage (void)
295 {
296     stgFree(g0s0); // frees all the steps
297     stgFree(generations);
298     freeAllMBlocks();
299 #if defined(THREADED_RTS)
300     closeMutex(&sm_mutex);
301     closeMutex(&atomic_modify_mutvar_mutex);
302 #endif
303     stgFree(nurseries);
304 }
305
306 /* -----------------------------------------------------------------------------
307    CAF management.
308
309    The entry code for every CAF does the following:
310      
311       - builds a CAF_BLACKHOLE in the heap
312       - pushes an update frame pointing to the CAF_BLACKHOLE
313       - invokes UPD_CAF(), which:
314           - calls newCaf, below
315           - updates the CAF with a static indirection to the CAF_BLACKHOLE
316       
317    Why do we build a BLACKHOLE in the heap rather than just updating
318    the thunk directly?  It's so that we only need one kind of update
319    frame - otherwise we'd need a static version of the update frame too.
320
321    newCaf() does the following:
322        
323       - it puts the CAF on the oldest generation's mut-once list.
324         This is so that we can treat the CAF as a root when collecting
325         younger generations.
326
327    For GHCI, we have additional requirements when dealing with CAFs:
328
329       - we must *retain* all dynamically-loaded CAFs ever entered,
330         just in case we need them again.
331       - we must be able to *revert* CAFs that have been evaluated, to
332         their pre-evaluated form.
333
334       To do this, we use an additional CAF list.  When newCaf() is
335       called on a dynamically-loaded CAF, we add it to the CAF list
336       instead of the old-generation mutable list, and save away its
337       old info pointer (in caf->saved_info) for later reversion.
338
339       To revert all the CAFs, we traverse the CAF list and reset the
340       info pointer to caf->saved_info, then throw away the CAF list.
341       (see GC.c:revertCAFs()).
342
343       -- SDM 29/1/01
344
345    -------------------------------------------------------------------------- */
346
347 void
348 newCAF(StgClosure* caf)
349 {
350   ACQUIRE_SM_LOCK;
351
352   if(keepCAFs)
353   {
354     // HACK:
355     // If we are in GHCi _and_ we are using dynamic libraries,
356     // then we can't redirect newCAF calls to newDynCAF (see below),
357     // so we make newCAF behave almost like newDynCAF.
358     // The dynamic libraries might be used by both the interpreted
359     // program and GHCi itself, so they must not be reverted.
360     // This also means that in GHCi with dynamic libraries, CAFs are not
361     // garbage collected. If this turns out to be a problem, we could
362     // do another hack here and do an address range test on caf to figure
363     // out whether it is from a dynamic library.
364     ((StgIndStatic *)caf)->saved_info  = (StgInfoTable *)caf->header.info;
365     ((StgIndStatic *)caf)->static_link = caf_list;
366     caf_list = caf;
367   }
368   else
369   {
370     /* Put this CAF on the mutable list for the old generation.
371     * This is a HACK - the IND_STATIC closure doesn't really have
372     * a mut_link field, but we pretend it has - in fact we re-use
373     * the STATIC_LINK field for the time being, because when we
374     * come to do a major GC we won't need the mut_link field
375     * any more and can use it as a STATIC_LINK.
376     */
377     ((StgIndStatic *)caf)->saved_info = NULL;
378     recordMutableGen(caf, oldest_gen->no);
379   }
380   
381   RELEASE_SM_LOCK;
382 }
383
384 // An alternate version of newCaf which is used for dynamically loaded
385 // object code in GHCi.  In this case we want to retain *all* CAFs in
386 // the object code, because they might be demanded at any time from an
387 // expression evaluated on the command line.
388 // Also, GHCi might want to revert CAFs, so we add these to the
389 // revertible_caf_list.
390 //
391 // The linker hackily arranges that references to newCaf from dynamic
392 // code end up pointing to newDynCAF.
393 void
394 newDynCAF(StgClosure *caf)
395 {
396     ACQUIRE_SM_LOCK;
397
398     ((StgIndStatic *)caf)->saved_info  = (StgInfoTable *)caf->header.info;
399     ((StgIndStatic *)caf)->static_link = revertible_caf_list;
400     revertible_caf_list = caf;
401
402     RELEASE_SM_LOCK;
403 }
404
405 /* -----------------------------------------------------------------------------
406    Nursery management.
407    -------------------------------------------------------------------------- */
408
409 static bdescr *
410 allocNursery (step *stp, bdescr *tail, nat blocks)
411 {
412     bdescr *bd;
413     nat i;
414
415     // Allocate a nursery: we allocate fresh blocks one at a time and
416     // cons them on to the front of the list, not forgetting to update
417     // the back pointer on the tail of the list to point to the new block.
418     for (i=0; i < blocks; i++) {
419         // @LDV profiling
420         /*
421           processNursery() in LdvProfile.c assumes that every block group in
422           the nursery contains only a single block. So, if a block group is
423           given multiple blocks, change processNursery() accordingly.
424         */
425         bd = allocBlock();
426         bd->link = tail;
427         // double-link the nursery: we might need to insert blocks
428         if (tail != NULL) {
429             tail->u.back = bd;
430         }
431         bd->step = stp;
432         bd->gen_no = 0;
433         bd->flags = 0;
434         bd->free = bd->start;
435         tail = bd;
436     }
437     tail->u.back = NULL;
438     return tail;
439 }
440
441 static void
442 assignNurseriesToCapabilities (void)
443 {
444 #ifdef THREADED_RTS
445     nat i;
446
447     for (i = 0; i < n_nurseries; i++) {
448         capabilities[i].r.rNursery        = &nurseries[i];
449         capabilities[i].r.rCurrentNursery = nurseries[i].blocks;
450         capabilities[i].r.rCurrentAlloc   = NULL;
451     }
452 #else /* THREADED_RTS */
453     MainCapability.r.rNursery        = &nurseries[0];
454     MainCapability.r.rCurrentNursery = nurseries[0].blocks;
455     MainCapability.r.rCurrentAlloc   = NULL;
456 #endif
457 }
458
459 void
460 allocNurseries( void )
461
462     nat i;
463
464     for (i = 0; i < n_nurseries; i++) {
465         nurseries[i].blocks = 
466             allocNursery(&nurseries[i], NULL, 
467                          RtsFlags.GcFlags.minAllocAreaSize);
468         nurseries[i].n_blocks    = RtsFlags.GcFlags.minAllocAreaSize;
469         nurseries[i].old_blocks   = NULL;
470         nurseries[i].n_old_blocks = 0;
471     }
472     assignNurseriesToCapabilities();
473 }
474       
475 void
476 resetNurseries( void )
477 {
478     nat i;
479     bdescr *bd;
480     step *stp;
481
482     for (i = 0; i < n_nurseries; i++) {
483         stp = &nurseries[i];
484         for (bd = stp->blocks; bd; bd = bd->link) {
485             bd->free = bd->start;
486             ASSERT(bd->gen_no == 0);
487             ASSERT(bd->step == stp);
488             IF_DEBUG(sanity,memset(bd->start, 0xaa, BLOCK_SIZE));
489         }
490     }
491     assignNurseriesToCapabilities();
492 }
493
494 lnat
495 countNurseryBlocks (void)
496 {
497     nat i;
498     lnat blocks = 0;
499
500     for (i = 0; i < n_nurseries; i++) {
501         blocks += nurseries[i].n_blocks;
502     }
503     return blocks;
504 }
505
506 static void
507 resizeNursery ( step *stp, nat blocks )
508 {
509   bdescr *bd;
510   nat nursery_blocks;
511
512   nursery_blocks = stp->n_blocks;
513   if (nursery_blocks == blocks) return;
514
515   if (nursery_blocks < blocks) {
516       debugTrace(DEBUG_gc, "increasing size of nursery to %d blocks", 
517                  blocks);
518     stp->blocks = allocNursery(stp, stp->blocks, blocks-nursery_blocks);
519   } 
520   else {
521     bdescr *next_bd;
522     
523     debugTrace(DEBUG_gc, "decreasing size of nursery to %d blocks", 
524                blocks);
525
526     bd = stp->blocks;
527     while (nursery_blocks > blocks) {
528         next_bd = bd->link;
529         next_bd->u.back = NULL;
530         nursery_blocks -= bd->blocks; // might be a large block
531         freeGroup(bd);
532         bd = next_bd;
533     }
534     stp->blocks = bd;
535     // might have gone just under, by freeing a large block, so make
536     // up the difference.
537     if (nursery_blocks < blocks) {
538         stp->blocks = allocNursery(stp, stp->blocks, blocks-nursery_blocks);
539     }
540   }
541   
542   stp->n_blocks = blocks;
543   ASSERT(countBlocks(stp->blocks) == stp->n_blocks);
544 }
545
546 // 
547 // Resize each of the nurseries to the specified size.
548 //
549 void
550 resizeNurseriesFixed (nat blocks)
551 {
552     nat i;
553     for (i = 0; i < n_nurseries; i++) {
554         resizeNursery(&nurseries[i], blocks);
555     }
556 }
557
558 // 
559 // Resize the nurseries to the total specified size.
560 //
561 void
562 resizeNurseries (nat blocks)
563 {
564     // If there are multiple nurseries, then we just divide the number
565     // of available blocks between them.
566     resizeNurseriesFixed(blocks / n_nurseries);
567 }
568
569
570 /* -----------------------------------------------------------------------------
571    move_TSO is called to update the TSO structure after it has been
572    moved from one place to another.
573    -------------------------------------------------------------------------- */
574
575 void
576 move_TSO (StgTSO *src, StgTSO *dest)
577 {
578     ptrdiff_t diff;
579
580     // relocate the stack pointer... 
581     diff = (StgPtr)dest - (StgPtr)src; // In *words* 
582     dest->sp = (StgPtr)dest->sp + diff;
583 }
584
585 /* -----------------------------------------------------------------------------
586    The allocate() interface
587
588    allocateInGen() function allocates memory directly into a specific
589    generation.  It always succeeds, and returns a chunk of memory n
590    words long.  n can be larger than the size of a block if necessary,
591    in which case a contiguous block group will be allocated.
592
593    allocate(n) is equivalent to allocateInGen(g0).
594    -------------------------------------------------------------------------- */
595
596 StgPtr
597 allocateInGen (generation *g, lnat n)
598 {
599     step *stp;
600     bdescr *bd;
601     StgPtr ret;
602
603     ACQUIRE_SM_LOCK;
604     
605     TICK_ALLOC_HEAP_NOCTR(n);
606     CCS_ALLOC(CCCS,n);
607
608     stp = &g->steps[0];
609
610     if (n >= LARGE_OBJECT_THRESHOLD/sizeof(W_))
611     {
612         lnat req_blocks =  (lnat)BLOCK_ROUND_UP(n*sizeof(W_)) / BLOCK_SIZE;
613
614         // Attempting to allocate an object larger than maxHeapSize
615         // should definitely be disallowed.  (bug #1791)
616         if (RtsFlags.GcFlags.maxHeapSize > 0 && 
617             req_blocks >= RtsFlags.GcFlags.maxHeapSize) {
618             heapOverflow();
619             // heapOverflow() doesn't exit (see #2592), but we aren't
620             // in a position to do a clean shutdown here: we
621             // either have to allocate the memory or exit now.
622             // Allocating the memory would be bad, because the user
623             // has requested that we not exceed maxHeapSize, so we
624             // just exit.
625             stg_exit(EXIT_HEAPOVERFLOW);
626         }
627
628         bd = allocGroup(req_blocks);
629         dbl_link_onto(bd, &stp->large_objects);
630         stp->n_large_blocks += bd->blocks; // might be larger than req_blocks
631         alloc_blocks += bd->blocks;
632         bd->gen_no  = g->no;
633         bd->step = stp;
634         bd->flags = BF_LARGE;
635         bd->free = bd->start + n;
636         ret = bd->start;
637     }
638     else
639     {
640         // small allocation (<LARGE_OBJECT_THRESHOLD) */
641         bd = stp->blocks;
642         if (bd == NULL || bd->free + n > bd->start + BLOCK_SIZE_W) {
643             bd = allocBlock();
644             bd->gen_no = g->no;
645             bd->step = stp;
646             bd->flags = 0;
647             bd->link = stp->blocks;
648             stp->blocks = bd;
649             stp->n_blocks++;
650             alloc_blocks++;
651         }
652         ret = bd->free;
653         bd->free += n;
654     }
655
656     RELEASE_SM_LOCK;
657
658     return ret;
659 }
660
661 StgPtr
662 allocate (lnat n)
663 {
664     return allocateInGen(g0,n);
665 }
666
667 lnat
668 allocatedBytes( void )
669 {
670     lnat allocated;
671
672     allocated = alloc_blocks * BLOCK_SIZE_W;
673     if (pinned_object_block != NULL) {
674         allocated -= (pinned_object_block->start + BLOCK_SIZE_W) - 
675             pinned_object_block->free;
676     }
677         
678     return allocated;
679 }
680
681 // split N blocks off the front of the given bdescr, returning the
682 // new block group.  We treat the remainder as if it
683 // had been freshly allocated in generation 0.
684 bdescr *
685 splitLargeBlock (bdescr *bd, nat blocks)
686 {
687     bdescr *new_bd;
688
689     // subtract the original number of blocks from the counter first
690     bd->step->n_large_blocks -= bd->blocks;
691
692     new_bd = splitBlockGroup (bd, blocks);
693
694     dbl_link_onto(new_bd, &g0s0->large_objects);
695     g0s0->n_large_blocks += new_bd->blocks;
696     new_bd->gen_no  = g0s0->no;
697     new_bd->step    = g0s0;
698     new_bd->flags   = BF_LARGE;
699     new_bd->free    = bd->free;
700     ASSERT(new_bd->free <= new_bd->start + new_bd->blocks * BLOCK_SIZE_W);
701
702     // add the new number of blocks to the counter.  Due to the gaps
703     // for block descriptor, new_bd->blocks + bd->blocks might not be
704     // equal to the original bd->blocks, which is why we do it this way.
705     bd->step->n_large_blocks += bd->blocks;
706
707     return new_bd;
708 }
709
710 /* -----------------------------------------------------------------------------
711    allocateLocal()
712
713    This allocates memory in the current thread - it is intended for
714    use primarily from STG-land where we have a Capability.  It is
715    better than allocate() because it doesn't require taking the
716    sm_mutex lock in the common case.
717
718    Memory is allocated directly from the nursery if possible (but not
719    from the current nursery block, so as not to interfere with
720    Hp/HpLim).
721    -------------------------------------------------------------------------- */
722
723 StgPtr
724 allocateLocal (Capability *cap, lnat n)
725 {
726     bdescr *bd;
727     StgPtr p;
728
729     if (n >= LARGE_OBJECT_THRESHOLD/sizeof(W_)) {
730         return allocateInGen(g0,n);
731     }
732
733     /* small allocation (<LARGE_OBJECT_THRESHOLD) */
734
735     TICK_ALLOC_HEAP_NOCTR(n);
736     CCS_ALLOC(CCCS,n);
737     
738     bd = cap->r.rCurrentAlloc;
739     if (bd == NULL || bd->free + n > bd->start + BLOCK_SIZE_W) {
740         
741         // The CurrentAlloc block is full, we need to find another
742         // one.  First, we try taking the next block from the
743         // nursery:
744         bd = cap->r.rCurrentNursery->link;
745         
746         if (bd == NULL || bd->free + n > bd->start + BLOCK_SIZE_W) {
747             // The nursery is empty, or the next block is already
748             // full: allocate a fresh block (we can't fail here).
749             ACQUIRE_SM_LOCK;
750             bd = allocBlock();
751             cap->r.rNursery->n_blocks++;
752             RELEASE_SM_LOCK;
753             bd->gen_no = 0;
754             bd->step = cap->r.rNursery;
755             bd->flags = 0;
756             // NO: alloc_blocks++;
757             // calcAllocated() uses the size of the nursery, and we've
758             // already bumpted nursery->n_blocks above.  We'll GC
759             // pretty quickly now anyway, because MAYBE_GC() will
760             // notice that CurrentNursery->link is NULL.
761         } else {
762             // we have a block in the nursery: take it and put
763             // it at the *front* of the nursery list, and use it
764             // to allocate() from.
765             cap->r.rCurrentNursery->link = bd->link;
766             if (bd->link != NULL) {
767                 bd->link->u.back = cap->r.rCurrentNursery;
768             }
769         }
770         dbl_link_onto(bd, &cap->r.rNursery->blocks);
771         cap->r.rCurrentAlloc = bd;
772         IF_DEBUG(sanity, checkNurserySanity(cap->r.rNursery));
773     }
774     p = bd->free;
775     bd->free += n;
776     return p;
777 }
778
779 /* ---------------------------------------------------------------------------
780    Allocate a fixed/pinned object.
781
782    We allocate small pinned objects into a single block, allocating a
783    new block when the current one overflows.  The block is chained
784    onto the large_object_list of generation 0 step 0.
785
786    NOTE: The GC can't in general handle pinned objects.  This
787    interface is only safe to use for ByteArrays, which have no
788    pointers and don't require scavenging.  It works because the
789    block's descriptor has the BF_LARGE flag set, so the block is
790    treated as a large object and chained onto various lists, rather
791    than the individual objects being copied.  However, when it comes
792    to scavenge the block, the GC will only scavenge the first object.
793    The reason is that the GC can't linearly scan a block of pinned
794    objects at the moment (doing so would require using the
795    mostly-copying techniques).  But since we're restricting ourselves
796    to pinned ByteArrays, not scavenging is ok.
797
798    This function is called by newPinnedByteArray# which immediately
799    fills the allocated memory with a MutableByteArray#.
800    ------------------------------------------------------------------------- */
801
802 StgPtr
803 allocatePinned( lnat n )
804 {
805     StgPtr p;
806     bdescr *bd = pinned_object_block;
807
808     // If the request is for a large object, then allocate()
809     // will give us a pinned object anyway.
810     if (n >= LARGE_OBJECT_THRESHOLD/sizeof(W_)) {
811         return allocate(n);
812     }
813
814     ACQUIRE_SM_LOCK;
815     
816     TICK_ALLOC_HEAP_NOCTR(n);
817     CCS_ALLOC(CCCS,n);
818
819     // we always return 8-byte aligned memory.  bd->free must be
820     // 8-byte aligned to begin with, so we just round up n to
821     // the nearest multiple of 8 bytes.
822     if (sizeof(StgWord) == 4) {
823         n = (n+1) & ~1;
824     }
825
826     // If we don't have a block of pinned objects yet, or the current
827     // one isn't large enough to hold the new object, allocate a new one.
828     if (bd == NULL || (bd->free + n) > (bd->start + BLOCK_SIZE_W)) {
829         pinned_object_block = bd = allocBlock();
830         dbl_link_onto(bd, &g0s0->large_objects);
831         g0s0->n_large_blocks++;
832         bd->gen_no = 0;
833         bd->step   = g0s0;
834         bd->flags  = BF_PINNED | BF_LARGE;
835         bd->free   = bd->start;
836         alloc_blocks++;
837     }
838
839     p = bd->free;
840     bd->free += n;
841     RELEASE_SM_LOCK;
842     return p;
843 }
844
845 /* -----------------------------------------------------------------------------
846    Write Barriers
847    -------------------------------------------------------------------------- */
848
849 /*
850    This is the write barrier for MUT_VARs, a.k.a. IORefs.  A
851    MUT_VAR_CLEAN object is not on the mutable list; a MUT_VAR_DIRTY
852    is.  When written to, a MUT_VAR_CLEAN turns into a MUT_VAR_DIRTY
853    and is put on the mutable list.
854 */
855 void
856 dirty_MUT_VAR(StgRegTable *reg, StgClosure *p)
857 {
858     Capability *cap = regTableToCapability(reg);
859     bdescr *bd;
860     if (p->header.info == &stg_MUT_VAR_CLEAN_info) {
861         p->header.info = &stg_MUT_VAR_DIRTY_info;
862         bd = Bdescr((StgPtr)p);
863         if (bd->gen_no > 0) recordMutableCap(p,cap,bd->gen_no);
864     }
865 }
866
867 // Setting a TSO's link field with a write barrier.
868 // It is *not* necessary to call this function when
869 //    * setting the link field to END_TSO_QUEUE
870 //    * putting a TSO on the blackhole_queue
871 //    * setting the link field of the currently running TSO, as it
872 //      will already be dirty.
873 void
874 setTSOLink (Capability *cap, StgTSO *tso, StgTSO *target)
875 {
876     bdescr *bd;
877     if ((tso->flags & (TSO_DIRTY|TSO_LINK_DIRTY)) == 0) {
878         tso->flags |= TSO_LINK_DIRTY;
879         bd = Bdescr((StgPtr)tso);
880         if (bd->gen_no > 0) recordMutableCap((StgClosure*)tso,cap,bd->gen_no);
881     }
882     tso->_link = target;
883 }
884
885 void
886 dirty_TSO (Capability *cap, StgTSO *tso)
887 {
888     bdescr *bd;
889     if ((tso->flags & (TSO_DIRTY|TSO_LINK_DIRTY)) == 0) {
890         bd = Bdescr((StgPtr)tso);
891         if (bd->gen_no > 0) recordMutableCap((StgClosure*)tso,cap,bd->gen_no);
892     }
893     tso->flags |= TSO_DIRTY;
894 }
895
896 /*
897    This is the write barrier for MVARs.  An MVAR_CLEAN objects is not
898    on the mutable list; a MVAR_DIRTY is.  When written to, a
899    MVAR_CLEAN turns into a MVAR_DIRTY and is put on the mutable list.
900    The check for MVAR_CLEAN is inlined at the call site for speed,
901    this really does make a difference on concurrency-heavy benchmarks
902    such as Chaneneos and cheap-concurrency.
903 */
904 void
905 dirty_MVAR(StgRegTable *reg, StgClosure *p)
906 {
907     Capability *cap = regTableToCapability(reg);
908     bdescr *bd;
909     bd = Bdescr((StgPtr)p);
910     if (bd->gen_no > 0) recordMutableCap(p,cap,bd->gen_no);
911 }
912
913 /* -----------------------------------------------------------------------------
914    Allocation functions for GMP.
915
916    These all use the allocate() interface - we can't have any garbage
917    collection going on during a gmp operation, so we use allocate()
918    which always succeeds.  The gmp operations which might need to
919    allocate will ask the storage manager (via doYouWantToGC()) whether
920    a garbage collection is required, in case we get into a loop doing
921    only allocate() style allocation.
922    -------------------------------------------------------------------------- */
923
924 static void *
925 stgAllocForGMP (size_t size_in_bytes)
926 {
927   StgArrWords* arr;
928   nat data_size_in_words, total_size_in_words;
929   
930   /* round up to a whole number of words */
931   data_size_in_words  = (size_in_bytes + sizeof(W_) + 1) / sizeof(W_);
932   total_size_in_words = sizeofW(StgArrWords) + data_size_in_words;
933   
934   /* allocate and fill it in. */
935 #if defined(THREADED_RTS)
936   arr = (StgArrWords *)allocateLocal(myTask()->cap, total_size_in_words);
937 #else
938   arr = (StgArrWords *)allocateLocal(&MainCapability, total_size_in_words);
939 #endif
940   SET_ARR_HDR(arr, &stg_ARR_WORDS_info, CCCS, data_size_in_words);
941   
942   /* and return a ptr to the goods inside the array */
943   return arr->payload;
944 }
945
946 static void *
947 stgReallocForGMP (void *ptr, size_t old_size, size_t new_size)
948 {
949     size_t min_size;
950     void *new_stuff_ptr = stgAllocForGMP(new_size);
951     nat i = 0;
952     char *p = (char *) ptr;
953     char *q = (char *) new_stuff_ptr;
954
955     min_size = old_size < new_size ? old_size : new_size;
956     for (; i < min_size; i++, p++, q++) {
957         *q = *p;
958     }
959
960     return(new_stuff_ptr);
961 }
962
963 static void
964 stgDeallocForGMP (void *ptr STG_UNUSED, 
965                   size_t size STG_UNUSED)
966 {
967     /* easy for us: the garbage collector does the dealloc'n */
968 }
969
970 /* -----------------------------------------------------------------------------
971  * Stats and stuff
972  * -------------------------------------------------------------------------- */
973
974 /* -----------------------------------------------------------------------------
975  * calcAllocated()
976  *
977  * Approximate how much we've allocated: number of blocks in the
978  * nursery + blocks allocated via allocate() - unused nusery blocks.
979  * This leaves a little slop at the end of each block, and doesn't
980  * take into account large objects (ToDo).
981  * -------------------------------------------------------------------------- */
982
983 lnat
984 calcAllocated( void )
985 {
986   nat allocated;
987   bdescr *bd;
988
989   allocated = allocatedBytes();
990   allocated += countNurseryBlocks() * BLOCK_SIZE_W;
991   
992   {
993 #ifdef THREADED_RTS
994   nat i;
995   for (i = 0; i < n_nurseries; i++) {
996       Capability *cap;
997       for ( bd = capabilities[i].r.rCurrentNursery->link; 
998             bd != NULL; bd = bd->link ) {
999           allocated -= BLOCK_SIZE_W;
1000       }
1001       cap = &capabilities[i];
1002       if (cap->r.rCurrentNursery->free < 
1003           cap->r.rCurrentNursery->start + BLOCK_SIZE_W) {
1004           allocated -= (cap->r.rCurrentNursery->start + BLOCK_SIZE_W)
1005               - cap->r.rCurrentNursery->free;
1006       }
1007   }
1008 #else
1009   bdescr *current_nursery = MainCapability.r.rCurrentNursery;
1010
1011   for ( bd = current_nursery->link; bd != NULL; bd = bd->link ) {
1012       allocated -= BLOCK_SIZE_W;
1013   }
1014   if (current_nursery->free < current_nursery->start + BLOCK_SIZE_W) {
1015       allocated -= (current_nursery->start + BLOCK_SIZE_W)
1016           - current_nursery->free;
1017   }
1018 #endif
1019   }
1020
1021   total_allocated += allocated;
1022   return allocated;
1023 }  
1024
1025 /* Approximate the amount of live data in the heap.  To be called just
1026  * after garbage collection (see GarbageCollect()).
1027  */
1028 lnat 
1029 calcLiveBlocks(void)
1030 {
1031   nat g, s;
1032   lnat live = 0;
1033   step *stp;
1034
1035   if (RtsFlags.GcFlags.generations == 1) {
1036       return g0s0->n_large_blocks + g0s0->n_blocks;
1037   }
1038
1039   for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
1040     for (s = 0; s < generations[g].n_steps; s++) {
1041       /* approximate amount of live data (doesn't take into account slop
1042        * at end of each block).
1043        */
1044       if (g == 0 && s == 0) { 
1045           continue; 
1046       }
1047       stp = &generations[g].steps[s];
1048       live += stp->n_large_blocks + stp->n_blocks;
1049     }
1050   }
1051   return live;
1052 }
1053
1054 lnat
1055 countOccupied(bdescr *bd)
1056 {
1057     lnat words;
1058
1059     words = 0;
1060     for (; bd != NULL; bd = bd->link) {
1061         ASSERT(bd->free <= bd->start + bd->blocks * BLOCK_SIZE_W);
1062         words += bd->free - bd->start;
1063     }
1064     return words;
1065 }
1066
1067 // Return an accurate count of the live data in the heap, excluding
1068 // generation 0.
1069 lnat
1070 calcLiveWords(void)
1071 {
1072     nat g, s;
1073     lnat live;
1074     step *stp;
1075     
1076     if (RtsFlags.GcFlags.generations == 1) {
1077         return g0s0->n_words + countOccupied(g0s0->large_objects);
1078     }
1079     
1080     live = 0;
1081     for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
1082         for (s = 0; s < generations[g].n_steps; s++) {
1083             if (g == 0 && s == 0) continue; 
1084             stp = &generations[g].steps[s];
1085             live += stp->n_words + countOccupied(stp->large_objects);
1086         } 
1087     }
1088     return live;
1089 }
1090
1091 /* Approximate the number of blocks that will be needed at the next
1092  * garbage collection.
1093  *
1094  * Assume: all data currently live will remain live.  Steps that will
1095  * be collected next time will therefore need twice as many blocks
1096  * since all the data will be copied.
1097  */
1098 extern lnat 
1099 calcNeeded(void)
1100 {
1101     lnat needed = 0;
1102     nat g, s;
1103     step *stp;
1104     
1105     for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
1106         for (s = 0; s < generations[g].n_steps; s++) {
1107             if (g == 0 && s == 0) { continue; }
1108             stp = &generations[g].steps[s];
1109
1110             // we need at least this much space
1111             needed += stp->n_blocks + stp->n_large_blocks;
1112
1113             // any additional space needed to collect this gen next time?
1114             if (g == 0 || // always collect gen 0
1115                 (generations[g].steps[0].n_blocks +
1116                  generations[g].steps[0].n_large_blocks 
1117                  > generations[g].max_blocks)) {
1118                 // we will collect this gen next time
1119                 if (stp->mark) {
1120                     //  bitmap:
1121                     needed += stp->n_blocks / BITS_IN(W_);
1122                     //  mark stack:
1123                     needed += stp->n_blocks / 100;
1124                 }
1125                 if (stp->compact) {
1126                     continue; // no additional space needed for compaction
1127                 } else {
1128                     needed += stp->n_blocks;
1129                 }
1130             }
1131         }
1132     }
1133     return needed;
1134 }
1135
1136 /* ----------------------------------------------------------------------------
1137    Executable memory
1138
1139    Executable memory must be managed separately from non-executable
1140    memory.  Most OSs these days require you to jump through hoops to
1141    dynamically allocate executable memory, due to various security
1142    measures.
1143
1144    Here we provide a small memory allocator for executable memory.
1145    Memory is managed with a page granularity; we allocate linearly
1146    in the page, and when the page is emptied (all objects on the page
1147    are free) we free the page again, not forgetting to make it
1148    non-executable.
1149
1150    TODO: The inability to handle objects bigger than BLOCK_SIZE_W means that
1151          the linker cannot use allocateExec for loading object code files
1152          on Windows. Once allocateExec can handle larger objects, the linker
1153          should be modified to use allocateExec instead of VirtualAlloc.
1154    ------------------------------------------------------------------------- */
1155
1156 #if defined(linux_HOST_OS)
1157
1158 // On Linux we need to use libffi for allocating executable memory,
1159 // because it knows how to work around the restrictions put in place
1160 // by SELinux.
1161
1162 void *allocateExec (nat bytes, void **exec_ret)
1163 {
1164     void **ret, **exec;
1165     ACQUIRE_SM_LOCK;
1166     ret = ffi_closure_alloc (sizeof(void *) + (size_t)bytes, (void**)&exec);
1167     RELEASE_SM_LOCK;
1168     if (ret == NULL) return ret;
1169     *ret = ret; // save the address of the writable mapping, for freeExec().
1170     *exec_ret = exec + 1;
1171     return (ret + 1);
1172 }
1173
1174 // freeExec gets passed the executable address, not the writable address. 
1175 void freeExec (void *addr)
1176 {
1177     void *writable;
1178     writable = *((void**)addr - 1);
1179     ACQUIRE_SM_LOCK;
1180     ffi_closure_free (writable);
1181     RELEASE_SM_LOCK
1182 }
1183
1184 #else
1185
1186 void *allocateExec (nat bytes, void **exec_ret)
1187 {
1188     void *ret;
1189     nat n;
1190
1191     ACQUIRE_SM_LOCK;
1192
1193     // round up to words.
1194     n  = (bytes + sizeof(W_) + 1) / sizeof(W_);
1195
1196     if (n+1 > BLOCK_SIZE_W) {
1197         barf("allocateExec: can't handle large objects");
1198     }
1199
1200     if (exec_block == NULL || 
1201         exec_block->free + n + 1 > exec_block->start + BLOCK_SIZE_W) {
1202         bdescr *bd;
1203         lnat pagesize = getPageSize();
1204         bd = allocGroup(stg_max(1, pagesize / BLOCK_SIZE));
1205         debugTrace(DEBUG_gc, "allocate exec block %p", bd->start);
1206         bd->gen_no = 0;
1207         bd->flags = BF_EXEC;
1208         bd->link = exec_block;
1209         if (exec_block != NULL) {
1210             exec_block->u.back = bd;
1211         }
1212         bd->u.back = NULL;
1213         setExecutable(bd->start, bd->blocks * BLOCK_SIZE, rtsTrue);
1214         exec_block = bd;
1215     }
1216     *(exec_block->free) = n;  // store the size of this chunk
1217     exec_block->gen_no += n;  // gen_no stores the number of words allocated
1218     ret = exec_block->free + 1;
1219     exec_block->free += n + 1;
1220
1221     RELEASE_SM_LOCK
1222     *exec_ret = ret;
1223     return ret;
1224 }
1225
1226 void freeExec (void *addr)
1227 {
1228     StgPtr p = (StgPtr)addr - 1;
1229     bdescr *bd = Bdescr((StgPtr)p);
1230
1231     if ((bd->flags & BF_EXEC) == 0) {
1232         barf("freeExec: not executable");
1233     }
1234
1235     if (*(StgPtr)p == 0) {
1236         barf("freeExec: already free?");
1237     }
1238
1239     ACQUIRE_SM_LOCK;
1240
1241     bd->gen_no -= *(StgPtr)p;
1242     *(StgPtr)p = 0;
1243
1244     if (bd->gen_no == 0) {
1245         // Free the block if it is empty, but not if it is the block at
1246         // the head of the queue.
1247         if (bd != exec_block) {
1248             debugTrace(DEBUG_gc, "free exec block %p", bd->start);
1249             dbl_link_remove(bd, &exec_block);
1250             setExecutable(bd->start, bd->blocks * BLOCK_SIZE, rtsFalse);
1251             freeGroup(bd);
1252         } else {
1253             bd->free = bd->start;
1254         }
1255     }
1256
1257     RELEASE_SM_LOCK
1258 }    
1259
1260 #endif /* mingw32_HOST_OS */
1261
1262 /* -----------------------------------------------------------------------------
1263    Debugging
1264
1265    memInventory() checks for memory leaks by counting up all the
1266    blocks we know about and comparing that to the number of blocks
1267    allegedly floating around in the system.
1268    -------------------------------------------------------------------------- */
1269
1270 #ifdef DEBUG
1271
1272 // Useful for finding partially full blocks in gdb
1273 void findSlop(bdescr *bd);
1274 void findSlop(bdescr *bd)
1275 {
1276     lnat slop;
1277
1278     for (; bd != NULL; bd = bd->link) {
1279         slop = (bd->blocks * BLOCK_SIZE_W) - (bd->free - bd->start);
1280         if (slop > (1024/sizeof(W_))) {
1281             debugBelch("block at %p (bdescr %p) has %ldKB slop\n",
1282                        bd->start, bd, slop / (1024/sizeof(W_)));
1283         }
1284     }
1285 }
1286
1287 nat
1288 countBlocks(bdescr *bd)
1289 {
1290     nat n;
1291     for (n=0; bd != NULL; bd=bd->link) {
1292         n += bd->blocks;
1293     }
1294     return n;
1295 }
1296
1297 // (*1) Just like countBlocks, except that we adjust the count for a
1298 // megablock group so that it doesn't include the extra few blocks
1299 // that would be taken up by block descriptors in the second and
1300 // subsequent megablock.  This is so we can tally the count with the
1301 // number of blocks allocated in the system, for memInventory().
1302 static nat
1303 countAllocdBlocks(bdescr *bd)
1304 {
1305     nat n;
1306     for (n=0; bd != NULL; bd=bd->link) {
1307         n += bd->blocks;
1308         // hack for megablock groups: see (*1) above
1309         if (bd->blocks > BLOCKS_PER_MBLOCK) {
1310             n -= (MBLOCK_SIZE / BLOCK_SIZE - BLOCKS_PER_MBLOCK)
1311                 * (bd->blocks/(MBLOCK_SIZE/BLOCK_SIZE));
1312         }
1313     }
1314     return n;
1315 }
1316
1317 static lnat
1318 stepBlocks (step *stp)
1319 {
1320     ASSERT(countBlocks(stp->blocks) == stp->n_blocks);
1321     ASSERT(countBlocks(stp->large_objects) == stp->n_large_blocks);
1322     return stp->n_blocks + stp->n_old_blocks + 
1323             countAllocdBlocks(stp->large_objects);
1324 }
1325
1326 // If memInventory() calculates that we have a memory leak, this
1327 // function will try to find the block(s) that are leaking by marking
1328 // all the ones that we know about, and search through memory to find
1329 // blocks that are not marked.  In the debugger this can help to give
1330 // us a clue about what kind of block leaked.  In the future we might
1331 // annotate blocks with their allocation site to give more helpful
1332 // info.
1333 static void
1334 findMemoryLeak (void)
1335 {
1336   nat g, s, i;
1337   for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
1338       for (i = 0; i < n_capabilities; i++) {
1339           markBlocks(capabilities[i].mut_lists[g]);
1340       }
1341       markBlocks(generations[g].mut_list);
1342       for (s = 0; s < generations[g].n_steps; s++) {
1343           markBlocks(generations[g].steps[s].blocks);
1344           markBlocks(generations[g].steps[s].large_objects);
1345       }
1346   }
1347
1348   for (i = 0; i < n_nurseries; i++) {
1349       markBlocks(nurseries[i].blocks);
1350       markBlocks(nurseries[i].large_objects);
1351   }
1352
1353 #ifdef PROFILING
1354   // TODO:
1355   // if (RtsFlags.ProfFlags.doHeapProfile == HEAP_BY_RETAINER) {
1356   //    markRetainerBlocks();
1357   // }
1358 #endif
1359
1360   // count the blocks allocated by the arena allocator
1361   // TODO:
1362   // markArenaBlocks();
1363
1364   // count the blocks containing executable memory
1365   markBlocks(exec_block);
1366
1367   reportUnmarkedBlocks();
1368 }
1369
1370
1371 void
1372 memInventory (rtsBool show)
1373 {
1374   nat g, s, i;
1375   step *stp;
1376   lnat gen_blocks[RtsFlags.GcFlags.generations];
1377   lnat nursery_blocks, retainer_blocks,
1378        arena_blocks, exec_blocks;
1379   lnat live_blocks = 0, free_blocks = 0;
1380   rtsBool leak;
1381
1382   // count the blocks we current have
1383
1384   for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
1385       gen_blocks[g] = 0;
1386       for (i = 0; i < n_capabilities; i++) {
1387           gen_blocks[g] += countBlocks(capabilities[i].mut_lists[g]);
1388       }   
1389       gen_blocks[g] += countAllocdBlocks(generations[g].mut_list);
1390       for (s = 0; s < generations[g].n_steps; s++) {
1391           stp = &generations[g].steps[s];
1392           gen_blocks[g] += stepBlocks(stp);
1393       }
1394   }
1395
1396   nursery_blocks = 0;
1397   for (i = 0; i < n_nurseries; i++) {
1398       nursery_blocks += stepBlocks(&nurseries[i]);
1399   }
1400
1401   retainer_blocks = 0;
1402 #ifdef PROFILING
1403   if (RtsFlags.ProfFlags.doHeapProfile == HEAP_BY_RETAINER) {
1404       retainer_blocks = retainerStackBlocks();
1405   }
1406 #endif
1407
1408   // count the blocks allocated by the arena allocator
1409   arena_blocks = arenaBlocks();
1410
1411   // count the blocks containing executable memory
1412   exec_blocks = countAllocdBlocks(exec_block);
1413
1414   /* count the blocks on the free list */
1415   free_blocks = countFreeList();
1416
1417   live_blocks = 0;
1418   for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
1419       live_blocks += gen_blocks[g];
1420   }
1421   live_blocks += nursery_blocks + 
1422                + retainer_blocks + arena_blocks + exec_blocks;
1423
1424 #define MB(n) (((n) * BLOCK_SIZE_W) / ((1024*1024)/sizeof(W_)))
1425
1426   leak = live_blocks + free_blocks != mblocks_allocated * BLOCKS_PER_MBLOCK;
1427
1428   if (show || leak)
1429   {
1430       if (leak) { 
1431           debugBelch("Memory leak detected:\n");
1432       } else {
1433           debugBelch("Memory inventory:\n");
1434       }
1435       for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
1436           debugBelch("  gen %d blocks : %5lu blocks (%lu MB)\n", g, 
1437                      gen_blocks[g], MB(gen_blocks[g]));
1438       }
1439       debugBelch("  nursery      : %5lu blocks (%lu MB)\n", 
1440                  nursery_blocks, MB(nursery_blocks));
1441       debugBelch("  retainer     : %5lu blocks (%lu MB)\n", 
1442                  retainer_blocks, MB(retainer_blocks));
1443       debugBelch("  arena blocks : %5lu blocks (%lu MB)\n", 
1444                  arena_blocks, MB(arena_blocks));
1445       debugBelch("  exec         : %5lu blocks (%lu MB)\n", 
1446                  exec_blocks, MB(exec_blocks));
1447       debugBelch("  free         : %5lu blocks (%lu MB)\n", 
1448                  free_blocks, MB(free_blocks));
1449       debugBelch("  total        : %5lu blocks (%lu MB)\n",
1450                  live_blocks + free_blocks, MB(live_blocks+free_blocks));
1451       if (leak) {
1452           debugBelch("\n  in system    : %5lu blocks (%lu MB)\n", 
1453                      mblocks_allocated * BLOCKS_PER_MBLOCK, mblocks_allocated);
1454       }
1455   }
1456
1457   if (leak) {
1458       debugBelch("\n");
1459       findMemoryLeak();
1460   }
1461   ASSERT(n_alloc_blocks == live_blocks);
1462   ASSERT(!leak);
1463 }
1464
1465
1466 /* Full heap sanity check. */
1467 void
1468 checkSanity( void )
1469 {
1470     nat g, s;
1471
1472     if (RtsFlags.GcFlags.generations == 1) {
1473         checkHeap(g0s0->blocks);
1474         checkChain(g0s0->large_objects);
1475     } else {
1476         
1477         for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
1478             for (s = 0; s < generations[g].n_steps; s++) {
1479                 if (g == 0 && s == 0) { continue; }
1480                 ASSERT(countBlocks(generations[g].steps[s].blocks)
1481                        == generations[g].steps[s].n_blocks);
1482                 ASSERT(countBlocks(generations[g].steps[s].large_objects)
1483                        == generations[g].steps[s].n_large_blocks);
1484                 checkHeap(generations[g].steps[s].blocks);
1485                 checkChain(generations[g].steps[s].large_objects);
1486                 if (g > 0) {
1487                     checkMutableList(generations[g].mut_list, g);
1488                 }
1489             }
1490         }
1491
1492         for (s = 0; s < n_nurseries; s++) {
1493             ASSERT(countBlocks(nurseries[s].blocks)
1494                    == nurseries[s].n_blocks);
1495             ASSERT(countBlocks(nurseries[s].large_objects)
1496                    == nurseries[s].n_large_blocks);
1497         }
1498             
1499         checkFreeListSanity();
1500     }
1501
1502 #if defined(THREADED_RTS)
1503     // check the stacks too in threaded mode, because we don't do a
1504     // full heap sanity check in this case (see checkHeap())
1505     checkGlobalTSOList(rtsTrue);
1506 #else
1507     checkGlobalTSOList(rtsFalse);
1508 #endif
1509 }
1510
1511 /* Nursery sanity check */
1512 void
1513 checkNurserySanity( step *stp )
1514 {
1515     bdescr *bd, *prev;
1516     nat blocks = 0;
1517
1518     prev = NULL;
1519     for (bd = stp->blocks; bd != NULL; bd = bd->link) {
1520         ASSERT(bd->u.back == prev);
1521         prev = bd;
1522         blocks += bd->blocks;
1523     }
1524     ASSERT(blocks == stp->n_blocks);
1525 }
1526
1527 // handy function for use in gdb, because Bdescr() is inlined.
1528 extern bdescr *_bdescr( StgPtr p );
1529
1530 bdescr *
1531 _bdescr( StgPtr p )
1532 {
1533     return Bdescr(p);
1534 }
1535
1536 #endif