Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mmalloc] Add mmcheck() which checks mmalloc heap consistency
authorGabriel Corona <gabriel.corona@loria.fr>
Thu, 17 Jul 2014 08:41:20 +0000 (10:41 +0200)
committerGabriel Corona <gabriel.corona@loria.fr>
Mon, 21 Jul 2014 09:04:46 +0000 (11:04 +0200)
src/xbt/mmalloc/mm_module.c
src/xbt/mmalloc/mmprivate.h

index bb3fbce..b0eeefc 100644 (file)
@@ -391,3 +391,32 @@ ssize_t mmalloc_get_busy_size(xbt_mheap_t heap, void *ptr){
   }
     
 }
+
+void mmcheck(xbt_mheap_t heap) {return;
+  if (!heap->heapinfo)
+    return;
+  malloc_info* heapinfo = NULL;
+  for (size_t i=1; i < heap->heaplimit; i += mmalloc_get_increment(heapinfo)) {
+    heapinfo = heap->heapinfo + i;
+    switch (heapinfo->type) {
+    case MMALLOC_TYPE_HEAPINFO:
+    case MMALLOC_TYPE_FREE:
+      if (heapinfo->free_block.size==0) {
+        xbt_die("Block size == 0");
+      }
+      break;
+    case MMALLOC_TYPE_UNFRAGMENTED:
+      if (heapinfo->busy_block.size==0) {
+        xbt_die("Block size == 0");
+      }
+      if (heapinfo->busy_block.busy_size==0 && heapinfo->busy_block.size!=0) {
+        xbt_die("Empty busy block");
+      }
+      break;
+    default:
+      if (heapinfo->type<0) {
+        xbt_die("Unkown mmalloc block type.");
+      }
+    }
+  }
+}
index 9100070..09cb4be 100644 (file)
@@ -308,4 +308,16 @@ static XBT_INLINE void  mmalloc_paranoia(struct mdesc *mdp){
 
 }
 
+static inline int mmalloc_get_increment(malloc_info* heapinfo) {
+  if (heapinfo->type < 0) {
+    return heapinfo->free_block.size;
+  } else if (heapinfo->type == 0) {
+    return heapinfo->busy_block.size;
+  } else {
+    return 1;
+  }
+}
+
+void mmcheck(xbt_mheap_t heap);
+
 #endif                          /* __MMPRIVATE_H */