/* -----------------------------------------------------------------------------
- * $Id: BlockAlloc.c,v 1.5 1999/03/26 14:54:43 simonm Exp $
+ * $Id: BlockAlloc.c,v 1.9 2001/07/23 17:23:19 simonmar Exp $
*
- * (c) The GHC Team 1998-1999
+ * (c) The GHC Team 1998-2000
*
* The block allocator and free list manager.
*
void *mblock;
bdescr *bd, **last;
+ ASSERT(n != 0);
+
if (n > BLOCKS_PER_MBLOCK) {
return allocMegaGroup(BLOCKS_TO_MBLOCKS(n));
}
*last = bd->link;
/* no initialisation necessary - this is already a
* self-contained block group. */
+#ifdef DEBUG
+ bd->free = bd->start; /* block isn't free now */
+#endif
return bd;
}
if (bd->blocks > n) { /* block too big... */
if (bd->blocks == BLOCKS_PER_MBLOCK) { /* whole megablock found */
- if (grp_start == NULL) { /* is it the first one we've found? */
+ /* is it the first one we've found or a non-contiguous megablock? */
+ if (grp_start == NULL ||
+ bd->start != last->start + MBLOCK_SIZE/sizeof(W_)) {
grp_start = bd;
grp_prev = last;
mbs_found = 1;
#ifdef DEBUG
p->free = (void *)-1; /* indicates that this block is free */
p->step = NULL;
- p->gen = NULL;
+ p->gen_no = 0;
/* fill the block group with garbage if sanity checking is on */
IF_DEBUG(sanity,memset(p->start, 0xaa, p->blocks * BLOCK_SIZE));
#endif