X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f3ae712a1b95294052b6e8136d0f0f2d4b30e6eb..b5858ae65676a0304a843e25d13d11df789106b6:/src/xbt/mmalloc/mfree.c diff --git a/src/xbt/mmalloc/mfree.c b/src/xbt/mmalloc/mfree.c index ca48a1e80f..66ec157be2 100644 --- a/src/xbt/mmalloc/mfree.c +++ b/src/xbt/mmalloc/mfree.c @@ -1,7 +1,6 @@ /* Free a block of memory allocated by `mmalloc'. */ -/* Copyright (c) 2010-2014. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2010-2017. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -23,7 +22,7 @@ void mfree(struct mdesc *mdp, void *ptr) { int type; size_t block, frag_nb; - register size_t i; + size_t i; int it; mmalloc_paranoia(mdp); @@ -42,12 +41,17 @@ void mfree(struct mdesc *mdp, void *ptr) type = mdp->heapinfo[block].type; switch (type) { - case -1: /* Already free */ + case MMALLOC_TYPE_HEAPINFO: UNLOCK(mdp); - THROWF(system_error, 0, "Asked to free a fragment in a block that is already free. I'm puzzled\n"); + THROWF(system_error, 0, "Asked to free a fragment in a heapinfo block. I'm confused.\n"); break; - - case 0: + + case MMALLOC_TYPE_FREE: /* Already free */ + UNLOCK(mdp); + THROWF(system_error, 0, "Asked to free a fragment in a block that is already free. I'm puzzled.\n"); + break; + + case MMALLOC_TYPE_UNFRAGMENTED: /* Get as many statistics as early as we can. */ mdp -> heapstats.chunks_used--; mdp -> heapstats.bytes_used -= @@ -83,12 +87,12 @@ void mfree(struct mdesc *mdp, void *ptr) mdp->heapinfo[i].free_block.size += mdp->heapinfo[block].busy_block.size; /* Mark all my ex-blocks as free */ for (it=0; itheapinfo[block].busy_block.size; it++) { - if (mdp->heapinfo[block+it].type <0) { + if (mdp->heapinfo[block+it].type < 0) { fprintf(stderr,"Internal Error: Asked to free a block already marked as free (block=%lu it=%d type=%lu). Please report this bug.\n", (unsigned long)block,it,(unsigned long)mdp->heapinfo[block].type); abort(); } - mdp->heapinfo[block+it].type = -1; + mdp->heapinfo[block+it].type = MMALLOC_TYPE_FREE; } block = i; @@ -108,7 +112,7 @@ void mfree(struct mdesc *mdp, void *ptr) (unsigned long)block,it,(unsigned long)mdp->heapinfo[block].free_block.size,(unsigned long)mdp->heapinfo[block].type); abort(); } - mdp->heapinfo[block+it].type = -1; + mdp->heapinfo[block+it].type = MMALLOC_TYPE_FREE; } } @@ -142,13 +146,18 @@ void mfree(struct mdesc *mdp, void *ptr) mdp -> heapstats.bytes_free -= bytes; } */ - /* Set the next search to begin at this block. - This is probably important to the trick where realloc returns the block to + /* Set the next search to begin at this block. + This is probably important to the trick where realloc returns the block to the system before reasking for the same block with a bigger size. */ mdp->heapindex = block; break; default: + if (type < 0) { + fprintf(stderr, "Unkown mmalloc block type.\n"); + abort(); + } + /* Do some of the statistics. */ mdp -> heapstats.chunks_used--; mdp -> heapstats.bytes_used -= 1 << type; @@ -178,16 +187,16 @@ void mfree(struct mdesc *mdp, void *ptr) xbt_swag_remove(&mdp->heapinfo[block],&mdp->fraghead[type]); /* pretend that this block is used and free it so that it gets properly coalesced with adjacent free blocks */ - mdp->heapinfo[block].type = 0; + mdp->heapinfo[block].type = MMALLOC_TYPE_UNFRAGMENTED; mdp->heapinfo[block].busy_block.size = 1; mdp->heapinfo[block].busy_block.busy_size = 0; - + /* Keep the statistics accurate. */ mdp -> heapstats.chunks_used++; mdp -> heapstats.bytes_used += BLOCKSIZE; mdp -> heapstats.chunks_free -= BLOCKSIZE >> type; mdp -> heapstats.bytes_free -= BLOCKSIZE; - + mfree((void *) mdp, (void *) ADDRESS(block)); } else if (mdp->heapinfo[block].busy_frag.nfree != 0) { /* If some fragments of this block are free, you know what? I'm already happy. */ @@ -205,4 +214,3 @@ void mfree(struct mdesc *mdp, void *ptr) break; } } -