type = mdp->heapinfo[block].busy.type;
switch (type) {
case 0:
- /* Get as many statistics as early as we can. */
- mdp->heapstats.chunks_used--;
- mdp->heapstats.bytes_used -=
- mdp->heapinfo[block].busy.info.size * BLOCKSIZE;
- mdp->heapstats.bytes_free +=
- mdp->heapinfo[block].busy.info.size * BLOCKSIZE;
-
/* Find the free cluster previous to this one in the free list.
Start searching at the last block referenced; this may benefit
programs with locality of allocation. */
/* Determine how to link this block into the free list. */
if (block == i + mdp->heapinfo[i].free.size) {
/* Coalesce this block with its predecessor. */
- mdp->heapinfo[i].free.size += mdp->heapinfo[block].busy.info.size;
+ mdp->heapinfo[i].free.size += mdp->heapinfo[block].busy.info.block.size;
block = i;
} else {
/* Really link this block back into the free list. */
- mdp->heapinfo[block].free.size = mdp->heapinfo[block].busy.info.size;
+ mdp->heapinfo[block].free.size = mdp->heapinfo[block].busy.info.block.size;
mdp->heapinfo[block].free.next = mdp->heapinfo[i].free.next;
mdp->heapinfo[block].free.prev = i;
mdp->heapinfo[i].free.next = block;
mdp->heapinfo[mdp->heapinfo[block].free.next].free.prev = block;
- mdp->heapstats.chunks_free++;
}
/* Now that the block is linked in, see if we can coalesce it
mdp->heapinfo[block].free.next
= mdp->heapinfo[mdp->heapinfo[block].free.next].free.next;
mdp->heapinfo[mdp->heapinfo[block].free.next].free.prev = block;
- mdp->heapstats.chunks_free--;
}
/* Now see if we can return stuff to the system. */
break;
default:
- /* Do some of the statistics. */
- mdp->heapstats.chunks_used--;
- mdp->heapstats.bytes_used -= 1 << type;
- mdp->heapstats.chunks_free++;
- mdp->heapstats.bytes_free += 1 << type;
-
/* Get the address of the first free fragment in this block. */
prev = (struct list *)
((char *) ADDRESS(block) +
next->prev = prev->prev;
}
mdp->heapinfo[block].busy.type = 0;
- mdp->heapinfo[block].busy.info.size = 1;
-
- /* Keep the statistics accurate. */
- mdp->heapstats.chunks_used++;
- mdp->heapstats.bytes_used += BLOCKSIZE;
- mdp->heapstats.chunks_free -= BLOCKSIZE >> type;
- mdp->heapstats.bytes_free -= BLOCKSIZE;
+ mdp->heapinfo[block].busy.info.block.size = 1;
+ mdp->heapinfo[block].busy.info.block.busy_size = 0;
mfree((void *) mdp, (void *) ADDRESS(block));
} else if (mdp->heapinfo[block].busy.info.frag.nfree != 0) {
/* Return memory to the heap. */
-void mfree(void *md, void *ptr)
+void mfree(xbt_mheap_t mdp, void *ptr)
{
- struct mdesc *mdp;
register struct alignlist *l;
if (ptr != NULL) {
- mdp = MD_TO_MDP(md);
for (l = mdp->aligned_blocks; l != NULL; l = l->next) {
if (l->aligned == ptr) {
l->aligned = NULL; /* Mark the slot in the list as free. */
break;
}
}
- if (mdp->mfree_hook != NULL) {
- mdp->mfree_hook(mdp, ptr);
- } else {
- __mmalloc_free(mdp, ptr);
- }
+ __mmalloc_free(mdp, ptr);
}
}