X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3b0750b6ed8bc6fef03b3cd4a46b0ccf33e4f4b5..2b3b5bd763d386fdf2f64236790cf86d1f3fd828:/src/xbt/mmalloc/mm_module.c diff --git a/src/xbt/mmalloc/mm_module.c b/src/xbt/mmalloc/mm_module.c index d553f4af67..096941c76a 100644 --- a/src/xbt/mmalloc/mm_module.c +++ b/src/xbt/mmalloc/mm_module.c @@ -27,16 +27,17 @@ not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include "src/internal_config.h" #include #include /* After sys/types.h, at least for dpx/2. */ #include #include -#ifdef HAVE_UNISTD_H +#if HAVE_UNISTD_H #include /* Prototypes for lseek */ #endif #include "mmprivate.h" #include "xbt/ex.h" -#include "xbt_modinter.h" /* declarations of mmalloc_preinit and friends that live here */ +#include "src/xbt_modinter.h" /* declarations of mmalloc_preinit and friends that live here */ #ifndef SEEK_SET #define SEEK_SET 0 @@ -326,7 +327,6 @@ static void mmalloc_fork_child(void) /* Initialize the default malloc descriptor. */ void *mmalloc_preinit(void) { - int res; if (__mmalloc_default_mdp == NULL) { if(!xbt_pagesize) xbt_pagesize = getpagesize(); @@ -336,8 +336,7 @@ void *mmalloc_preinit(void) /* Fixme? only the default mdp in protected against forks */ // 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); + int 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); } @@ -353,27 +352,31 @@ void mmalloc_postexit(void) // xbt_mheap_destroy_no_free(__mmalloc_default_mdp); } -size_t mmalloc_get_bytes_used(xbt_mheap_t heap){ - int i = 0, j = 0; +// This is the underlying implementation of mmalloc_get_bytes_used_remote. +// Is it used directly in order to evaluate the bytes used from a different +// process. +size_t mmalloc_get_bytes_used_remote(size_t heaplimit, const malloc_info* heapinfo) +{ int bytes = 0; - - while(i<=((struct mdesc *)heap)->heaplimit){ - if(((struct mdesc *)heap)->heapinfo[i].type == MMALLOC_TYPE_UNFRAGMENTED){ - 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]; + for (size_t i=0; i < heaplimit; ++i){ + if (heapinfo[i].type == MMALLOC_TYPE_UNFRAGMENTED){ + if (heapinfo[i].busy_block.busy_size > 0) + bytes += heapinfo[i].busy_block.busy_size; + } else if (heapinfo[i].type > 0) { + for (size_t j=0; j < (size_t) (BLOCKSIZE >> heapinfo[i].type); j++){ + if(heapinfo[i].busy_frag.frag_size[j] > 0) + bytes += heapinfo[i].busy_frag.frag_size[j]; } } - i++; } - return bytes; } +size_t mmalloc_get_bytes_used(const xbt_mheap_t heap){ + const struct mdesc* heap_data = (const struct mdesc *) heap; + return mmalloc_get_bytes_used_remote(heap_data->heaplimit, heap_data->heapinfo); +} + ssize_t mmalloc_get_busy_size(xbt_mheap_t heap, void *ptr){ ssize_t block = ((char*)ptr - (char*)(heap->heapbase)) / BLOCKSIZE + 1;