X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/e56c4673fbfe4965240725a4c09dc294d920c8d5..8ed41a8d8b27bd21b00a4c24af81eecb4637fa1a:/src/xbt/mmalloc/mmalloc.c diff --git a/src/xbt/mmalloc/mmalloc.c b/src/xbt/mmalloc/mmalloc.c index 23db293271..355b24c1a3 100644 --- a/src/xbt/mmalloc/mmalloc.c +++ b/src/xbt/mmalloc/mmalloc.c @@ -32,7 +32,8 @@ static void *align(struct mdesc *mdp, size_t size) * complete the reservation by also asking for the full lastest block. * * Also, the returned block is aligned to the end of block (but I've - * no fucking idea of why, actually -- http://abstrusegoose.com/432). + * no fucking idea of why, actually -- http://abstrusegoose.com/432 -- + * but not doing so seems to lead to issues). */ adj = RESIDUAL(result, BLOCKSIZE); if (adj != 0) { @@ -75,26 +76,25 @@ static void *register_morecore(struct mdesc *mdp, size_t size) return (NULL); } - /* Check if we need to grow the info table. */ + /* Check if we need to grow the info table (in a multiplicative manner) */ if ((size_t) BLOCK((char *) result + size) > mdp->heapsize) { + newsize = mdp->heapsize; - while ((size_t) BLOCK((char *) result + size) > newsize) { + while ((size_t) BLOCK((char *) result + size) > newsize) newsize *= 2; - } - newinfo = (malloc_info *) align(mdp, newsize * sizeof(malloc_info)); - if (newinfo == NULL) { - mmorecore(mdp, -size); - return (NULL); - } - memset((void *) newinfo, 0, newsize * sizeof(malloc_info)); - memcpy((void *) newinfo, (void *) mdp->heapinfo, - mdp->heapsize * sizeof(malloc_info)); + + /* Copy old info into new location */ oldinfo = mdp->heapinfo; + newinfo = (malloc_info *) align(mdp, newsize * sizeof(malloc_info)); + memset(newinfo, 0, newsize * sizeof(malloc_info)); + memcpy(newinfo, oldinfo, mdp->heapsize * sizeof(malloc_info)); + mdp->heapinfo = newinfo; + + /* mark the space previously occupied by the block info as free by first marking it + * as occupied in the regular way, and then freing it */ newinfo[BLOCK(oldinfo)].busy.type = 0; - newinfo[BLOCK(oldinfo)].busy.info.block.size - = BLOCKIFY(mdp->heapsize * sizeof(malloc_info)); + newinfo[BLOCK(oldinfo)].busy.info.block.size = BLOCKIFY(mdp->heapsize * sizeof(malloc_info)); newinfo[BLOCK(oldinfo)].busy.info.block.busy_size = size; - mdp->heapinfo = newinfo; __mmalloc_free(mdp, (void *) oldinfo); mdp->heapsize = newsize; }