X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/027d955aa752674c7d524a3bba004aaa7af1d0dc..16c050ac033cf63b085c65f5c313ed4b71a7108a:/src/xbt/mmalloc/mrealloc.c?ds=sidebyside diff --git a/src/xbt/mmalloc/mrealloc.c b/src/xbt/mmalloc/mrealloc.c index 5928d132de..3176981d68 100644 --- a/src/xbt/mmalloc/mrealloc.c +++ b/src/xbt/mmalloc/mrealloc.c @@ -26,7 +26,7 @@ void *mrealloc(xbt_mheap_t mdp, void *ptr, size_t size) int type; size_t block, blocks, oldlimit; - /* Only keep real realloc and hidden malloc and free to the relevant functions */ + /* Only keep real realloc, and reroute hidden malloc and free to the relevant functions */ if (size == 0) { mfree(mdp, ptr); return mmalloc(mdp, 0); @@ -47,16 +47,20 @@ void *mrealloc(xbt_mheap_t mdp, void *ptr, size_t size) block = BLOCK(ptr); type = mdp->heapinfo[block].type; - if (type<0) - THROWF(arg_error,0,"Asked realloc a fragment comming from a *free* block. I'm puzzled."); switch (type) { + case -1: + fprintf(stderr, "Asked realloc a fragment comming from a *free* block. I'm puzzled.\n"); + abort(); + break; + case 0: /* Maybe reallocate a large block to a small fragment. */ - if (size <= BLOCKSIZE / 2) { - //printf("(%s) alloc large block...",xbt_thread_self_name()); + + if (size <= BLOCKSIZE / 2) { // Full block -> Fragment; no need to optimize for time + result = mmalloc(mdp, size); - if (result != NULL) { + if (result != NULL) { // useless (mmalloc never returns NULL), but harmless memcpy(result, ptr, size); mfree(mdp, ptr); return (result); @@ -67,13 +71,16 @@ void *mrealloc(xbt_mheap_t mdp, void *ptr, size_t size) see if we can hold it in place. */ blocks = BLOCKIFY(size); if (blocks < mdp->heapinfo[block].busy_block.size) { + int it; /* The new size is smaller; return excess memory to the free list. */ //printf("(%s) return excess memory...",xbt_thread_self_name()); - mdp->heapinfo[block + blocks].type = 0; + for (it= block+blocks; it< mdp->heapinfo[block].busy_block.size ; it++) + mdp->heapinfo[it].type = 0; mdp->heapinfo[block + blocks].busy_block.size = mdp->heapinfo[block].busy_block.size - blocks; mdp->heapinfo[block].busy_block.size = blocks; mdp->heapinfo[block].busy_block.busy_size = size; + mfree(mdp, ADDRESS(block + blocks)); result = ptr; } else if (blocks == mdp->heapinfo[block].busy_block.size) {