X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3fe1dfd358798ef005607b3118f36adb914375d2..c128702f75d1981c4a082ae6e4630f614074ab6e:/src/xbt/mmalloc/mm_module.c diff --git a/src/xbt/mmalloc/mm_module.c b/src/xbt/mmalloc/mm_module.c index 1272d4ddb5..01c0bce8c2 100644 --- a/src/xbt/mmalloc/mm_module.c +++ b/src/xbt/mmalloc/mm_module.c @@ -312,8 +312,6 @@ static void mmalloc_fork_child(void) } } - - /* Initialize the default malloc descriptor. */ void *mmalloc_preinit(void) { @@ -323,13 +321,19 @@ void *mmalloc_preinit(void) void *addr = (void*)(((unsigned long)sbrk(0) + HEAP_OFFSET) & mask); __mmalloc_default_mdp = xbt_mheap_new(-1, addr); /* Fixme? only the default mdp in protected against forks */ - res = xbt_os_thread_atfork(mmalloc_fork_prepare, + // This is mandated to protect the mmalloced areas through forks. Think of tesh. + // Nah, removing the mutex isn't a good idea either for tesh + res = xbt_os_thread_atfork(mmalloc_fork_prepare, mmalloc_fork_parent, mmalloc_fork_child); if (res != 0) THROWF(system_error,0,"xbt_os_thread_atfork() failed: return value %d",res); } xbt_assert(__mmalloc_default_mdp != NULL); +#if defined(HAVE_GNU_LD) && defined(MMALLOC_WANT_OVERRIDE_LEGACY) + mm_gnuld_legacy_init(); +#endif + return __mmalloc_default_mdp; } @@ -339,3 +343,38 @@ void mmalloc_postexit(void) // mmalloc_detach(__mmalloc_default_mdp); xbt_mheap_destroy_no_free(__mmalloc_default_mdp); } + +size_t mmalloc_get_bytes_used(xbt_mheap_t heap){ + int i = 0, j = 0; + int bytes = 0; + + while(i<=((struct mdesc *)heap)->heaplimit){ + if(((struct mdesc *)heap)->heapinfo[i].type == 0){ + if(((struct mdesc *)heap)->heapinfo[i].busy_block.busy_size > 0) + bytes += ((struct mdesc *)heap)->heapinfo[i].busy_block.busy_size; + + }else if(((struct mdesc *)heap)->heapinfo[i].type > 0){ + for(j=0; j < (size_t) (BLOCKSIZE >> ((struct mdesc *)heap)->heapinfo[i].type); j++){ + if(((struct mdesc *)heap)->heapinfo[i].busy_frag.frag_size[j] > 0) + bytes += ((struct mdesc *)heap)->heapinfo[i].busy_frag.frag_size[j]; + } + } + i++; + } + + return bytes; +} + +ssize_t mmalloc_get_busy_size(xbt_mheap_t heap, void *ptr){ + + ssize_t block = ((char*)ptr - (char*)(heap->heapbase)) / BLOCKSIZE + 1; + if(heap->heapinfo[block].type == -1) + return -1; + else if(heap->heapinfo[block].type == 0) + return heap->heapinfo[block].busy_block.busy_size; + else{ + ssize_t frag = ((uintptr_t) (ADDR2UINT (ptr) % (BLOCKSIZE))) >> heap->heapinfo[block].type; + return heap->heapinfo[block].busy_frag.frag_size[frag]; + } + +}