X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c7b463c9c17665403d001fc59cb649551e93d950..27eac930728f84bf31b65013f7d95e39b3ea0063:/src/xbt/mmalloc/mmalloc.c diff --git a/src/xbt/mmalloc/mmalloc.c b/src/xbt/mmalloc/mmalloc.c index ce35d8a912..c54fb4c52e 100644 --- a/src/xbt/mmalloc/mmalloc.c +++ b/src/xbt/mmalloc/mmalloc.c @@ -106,8 +106,15 @@ static void *register_morecore(struct mdesc *mdp, size_t size) } /* Allocate memory from the heap. */ - -void *mmalloc(xbt_mheap_t mdp, size_t size) +void *mmalloc(xbt_mheap_t mdp, size_t size) { + void *res= mmalloc_no_memset(mdp,size); + memset(res,0,size); + return res; +} +/* Spliting mmalloc this way is mandated by a trick in mrealloc, that gives + back the memory of big blocks to the system before reallocating them: we don't + want to loose the beginning of the area when this happens */ +void *mmalloc_no_memset(xbt_mheap_t mdp, size_t size) { void *result; size_t block, blocks, lastblocks, start; @@ -161,7 +168,7 @@ void *mmalloc(xbt_mheap_t mdp, size_t size) } if (--mdp->heapinfo[block].busy_frag.nfree != 0) { mdp->heapinfo[block].busy_frag.first = - RESIDUAL(next->next, BLOCKSIZE) >> log; + RESIDUAL(next->next, BLOCKSIZE) >> log; } /* Update the statistics. */ @@ -170,20 +177,17 @@ void *mmalloc(xbt_mheap_t mdp, size_t size) mdp -> heapstats.chunks_free--; mdp -> heapstats.bytes_free -= 1 << log; - memset(result, 0, requested_size); - } else { /* No free fragments of the desired size, so get a new block and break it into fragments, returning the first. */ //printf("(%s) No free fragment...",xbt_thread_self_name()); result = mmalloc(mdp, BLOCKSIZE); // does not return NULL - memset(result, 0, requested_size); - /* Link all fragments but the first into the free list, and mark their requested size to 0. */ + /* Link all fragments but the first into the free list, and mark their requested size to -1. */ block = BLOCK(result); for (i = 1; i < (size_t) (BLOCKSIZE >> log); ++i) { - mdp->heapinfo[block].busy_frag.frag_size[i] = 0; + mdp->heapinfo[block].busy_frag.frag_size[i] = -1; next = (struct list *) ((char *) result + (i << log)); next->next = mdp->fraghead[log].next; next->prev = &mdp->fraghead[log]; @@ -213,8 +217,8 @@ void *mmalloc(xbt_mheap_t mdp, size_t size) start = block = MALLOC_SEARCH_START; while (mdp->heapinfo[block].free_block.size < blocks) { if (mdp->heapinfo[block].type >=0) { // Don't trust xbt_die and friends in malloc-level library, you fool! - fprintf(stderr,"Internal error: found a free block not marked as such (block=%lu type=%lu). Please report this bug.\n",(unsigned long)block,(unsigned long)mdp->heapinfo[block].type); - abort(); + fprintf(stderr,"Internal error: found a free block not marked as such (block=%lu type=%lu). Please report this bug.\n",(unsigned long)block,(unsigned long)mdp->heapinfo[block].type); + abort(); } block = mdp->heapinfo[block].free_block.next; @@ -237,16 +241,16 @@ void *mmalloc(xbt_mheap_t mdp, size_t size) continue; } result = register_morecore(mdp, blocks * BLOCKSIZE); - memset(result, 0, requested_size); block = BLOCK(result); - for (it=0;itheapinfo[block+it].type = 0; + for (it=0;itheapinfo[block+it].type = 0; + } mdp->heapinfo[block].busy_block.size = blocks; mdp->heapinfo[block].busy_block.busy_size = requested_size; mdp->heapinfo[block].busy_block.bt_size=xbt_backtrace_no_malloc(mdp->heapinfo[block].busy_block.bt,XBT_BACKTRACE_SIZE); - mdp -> heapstats.chunks_used++; - mdp -> heapstats.bytes_used += blocks * BLOCKSIZE; + mdp -> heapstats.chunks_used++; + mdp -> heapstats.bytes_used += blocks * BLOCKSIZE; return result; } /* Need large block(s), but found some in the existing heap */ @@ -259,25 +263,26 @@ void *mmalloc(xbt_mheap_t mdp, size_t size) /* The block we found has a bit left over, so relink the tail end back into the free list. */ mdp->heapinfo[block + blocks].free_block.size - = mdp->heapinfo[block].free_block.size - blocks; + = mdp->heapinfo[block].free_block.size - blocks; mdp->heapinfo[block + blocks].free_block.next - = mdp->heapinfo[block].free_block.next; + = mdp->heapinfo[block].free_block.next; mdp->heapinfo[block + blocks].free_block.prev - = mdp->heapinfo[block].free_block.prev; + = mdp->heapinfo[block].free_block.prev; mdp->heapinfo[mdp->heapinfo[block].free_block.prev].free_block.next - = mdp->heapinfo[mdp->heapinfo[block].free_block.next].free_block.prev - = mdp->heapindex = block + blocks; + = mdp->heapinfo[mdp->heapinfo[block].free_block.next].free_block.prev + = mdp->heapindex = block + blocks; } else { /* The block exactly matches our requirements, so just remove it from the list. */ mdp->heapinfo[mdp->heapinfo[block].free_block.next].free_block.prev - = mdp->heapinfo[block].free_block.prev; + = mdp->heapinfo[block].free_block.prev; mdp->heapinfo[mdp->heapinfo[block].free_block.prev].free_block.next - = mdp->heapindex = mdp->heapinfo[block].free_block.next; + = mdp->heapindex = mdp->heapinfo[block].free_block.next; } - for (it=0;itheapinfo[block+it].type = 0; + } mdp->heapinfo[block].busy_block.size = blocks; mdp->heapinfo[block].busy_block.busy_size = requested_size; //mdp->heapinfo[block].busy_block.bt_size = 0; @@ -286,6 +291,7 @@ void *mmalloc(xbt_mheap_t mdp, size_t size) mdp -> heapstats.chunks_used++; mdp -> heapstats.bytes_used += blocks * BLOCKSIZE; mdp -> heapstats.bytes_free -= blocks * BLOCKSIZE; + } //printf("(%s) Done mallocing. Result is %p\n",xbt_thread_self_name(),result);fflush(stdout); return (result);