X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7a21edf0ad00eee185ec492e9bbf094901fa25fe..c0a4a200c90b3384121aa4b6e30acaed9e3bd0ac:/src/xbt/mmalloc/mfree.c diff --git a/src/xbt/mmalloc/mfree.c b/src/xbt/mmalloc/mfree.c index e522919e0e..5294c14e49 100644 --- a/src/xbt/mmalloc/mfree.c +++ b/src/xbt/mmalloc/mfree.c @@ -1,18 +1,19 @@ -/* Free a block of memory allocated by `mmalloc'. - Copyright 1990, 1991, 1992 Free Software Foundation +/* Free a block of memory allocated by `mmalloc'. */ - Written May 1989 by Mike Haertel. - Heavily modified Mar 1992 by Fred Fish. (fnf@cygnus.com) */ - -/* Copyright (c) 2010. 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. */ +/* Copyright 1990, 1991, 1992 Free Software Foundation + + Written May 1989 by Mike Haertel. + Heavily modified Mar 1992 by Fred Fish. (fnf@cygnus.com) */ + #include "mmprivate.h" #include "xbt/ex.h" #include "mc/mc.h" +#include "src/mc/mc_ignore.h" /* Return memory to the heap. Like `mfree' but don't call a mfree_hook if there is one. */ @@ -22,7 +23,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); @@ -34,19 +35,24 @@ void mfree(struct mdesc *mdp, void *ptr) block = BLOCK(ptr); if ((char *) ptr < (char *) mdp->heapbase || block > mdp->heapsize) { - fprintf(stderr,"Ouch, this pointer is not mine. I refuse to free it. I refuse it to death!!\n"); + fprintf(stderr,"Ouch, this pointer is not mine, I refuse to free it. Give me valid pointers, or give me death!!\n"); abort(); } 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 -= @@ -82,12 +88,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; @@ -107,7 +113,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; } } @@ -141,13 +147,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; @@ -177,16 +188,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. */ @@ -204,4 +215,3 @@ void mfree(struct mdesc *mdp, void *ptr) break; } } -