Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
model-checker : get bytes used in std_heap instead of chunks used
[simgrid.git] / src / xbt / mmalloc / mm_module.c
index 8f538f1..0dfd027 100644 (file)
@@ -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;
 }
 
@@ -340,21 +344,24 @@ void mmalloc_postexit(void)
   xbt_mheap_destroy_no_free(__mmalloc_default_mdp);
 }
 
-void check_fraghead(struct mdesc *mdp){
-
-  struct list* next;
-  int j;
-
-  for (j=8; j<12; j++){
-    next = mdp->fraghead[j].next;
-    if(next != NULL){
-      while(next->next != NULL){
-        if(next->next->prev == NULL);
-        next = next->next;
+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++; 
   }
 
-  //fprintf(stderr, "check fraghead ok\n");
-
+  return bytes;
 }
+