Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
model-checker : move function from mc_global in mm_module (compilation error without MC)
[simgrid.git] / src / xbt / mmalloc / mm_module.c
index 1272d4d..b31daac 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;
 }
 
@@ -339,3 +343,40 @@ void mmalloc_postexit(void)
   //  mmalloc_detach(__mmalloc_default_mdp);
   xbt_mheap_destroy_no_free(__mmalloc_default_mdp);
 }
+
+size_t mmalloc_get_chunks_used(xbt_mheap_t heap){
+  return ((struct mdesc *)heap)->heapstats.chunks_used;
+}
+
+void remove_ignore_heap(void *address, size_t size){
+  
+  unsigned int cursor = 0;
+  int start = 0;
+  int end = xbt_dynar_length(mc_heap_comparison_ignore) - 1;
+  mc_heap_ignore_region_t region;
+  int ignore_found = 0;
+
+  while(start <= end){
+    cursor = (start + end) / 2;
+    region = (mc_heap_ignore_region_t)xbt_dynar_get_as(mc_heap_comparison_ignore, cursor, mc_heap_ignore_region_t);
+    if(region->address == address){
+      ignore_found = 1;
+      break;
+    }
+    if(region->address < address)
+      start = cursor + 1;
+    if(region->address > address){
+      if((char * )region->address <= ((char *)address + size)){
+        ignore_found = 1;
+        break;
+      }else
+        end = cursor - 1;   
+    }
+  }
+  
+  if(ignore_found == 1){
+    xbt_dynar_remove_at(mc_heap_comparison_ignore, cursor, NULL);
+    remove_ignore_heap(address, size);
+  }
+
+}