-/* Initialization for access to a mmap'd malloc managed region.
- Copyright 1992, 2000 Free Software Foundation, Inc.
+/* Initialization for access to a mmap'd malloc managed region. */
+
+/* Copyright (c) 2012-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+/* Copyright 1992, 2000 Free Software Foundation, Inc.
Contributed by Fred Fish at Cygnus Support. fnf@cygnus.com
{
int res;
if (__mmalloc_default_mdp == NULL) {
- unsigned long mask = ~((unsigned long)getpagesize() - 1);
+ unsigned long mask = ~((unsigned long)xbt_pagesize - 1);
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 */
void mmalloc_postexit(void)
{
- /* Do not detach the default mdp or ldl won't be able to free the memory it allocated since we're in memory */
- // mmalloc_detach(__mmalloc_default_mdp);
- xbt_mheap_destroy_no_free(__mmalloc_default_mdp);
+ /* Do not destroy the default mdp or ldl won't be able to free the memory it
+ * allocated since we're in memory */
+ // 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;
}
-size_t mmalloc_get_chunks_used(xbt_mheap_t heap){
- return ((struct mdesc *)heap)->heapstats.chunks_used;
+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];
+ }
+
}