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