X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/60dfbf03645430333993376b5bc0f567ec417b38..c3a62fa6cb46d329c17e48d2d0b73de787ae94e0:/src/xbt/mmalloc/mmalloc.c diff --git a/src/xbt/mmalloc/mmalloc.c b/src/xbt/mmalloc/mmalloc.c index bbdc9375f9..f3f4b844f9 100644 --- a/src/xbt/mmalloc/mmalloc.c +++ b/src/xbt/mmalloc/mmalloc.c @@ -161,20 +161,30 @@ 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. */ + mdp -> heapstats.chunks_used++; + mdp -> heapstats.bytes_used += 1 << log; + 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. */ 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] = 0; + mdp->heapinfo[block].busy_frag.equal_to[i] = -1; next = (struct list *) ((char *) result + (i << log)); next->next = mdp->fraghead[log].next; next->prev = &mdp->fraghead[log]; @@ -190,6 +200,10 @@ void *mmalloc(xbt_mheap_t mdp, size_t size) mdp->heapinfo[block].type = log; mdp->heapinfo[block].busy_frag.nfree = i - 1; mdp->heapinfo[block].busy_frag.first = i - 1; + + mdp -> heapstats.chunks_free += (BLOCKSIZE >> log) - 1; + mdp -> heapstats.bytes_free += BLOCKSIZE - (1 << log); + mdp -> heapstats.bytes_used -= BLOCKSIZE - (1 << log); } } else { /* Large allocation to receive one or more blocks. @@ -200,8 +214,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; @@ -224,14 +238,17 @@ 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; return result; } /* Need large block(s), but found some in the existing heap */ @@ -244,29 +261,36 @@ 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; 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.bytes_free -= blocks * BLOCKSIZE; + + memset(result, 0, requested_size); } //printf("(%s) Done mallocing. Result is %p\n",xbt_thread_self_name(),result);fflush(stdout); return (result);