Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
there were no difference between __mmalloc_free and mfree anymore; merge them
[simgrid.git] / src / xbt / mmalloc / mm_legacy.c
index 0de0dd2..b353835 100644 (file)
@@ -22,8 +22,6 @@ xbt_mheap_t __mmalloc_default_mdp = NULL;
 
 static xbt_mheap_t __mmalloc_current_heap = NULL;     /* The heap we are currently using. */
 
-#include "xbt_modinter.h"
-
 xbt_mheap_t mmalloc_get_current_heap(void)
 {
   return __mmalloc_current_heap;
@@ -48,16 +46,12 @@ void *malloc(size_t n)
 
 void *calloc(size_t nmemb, size_t size)
 {
-  size_t total_size = nmemb * size;
   xbt_mheap_t mdp = __mmalloc_current_heap ?: (xbt_mheap_t) mmalloc_preinit();
 
   LOCK(mdp);
-  void *ret = mmalloc(mdp, total_size);
+  void *ret = mcalloc(mdp, nmemb,size);
   UNLOCK(mdp);
 
-  /* Fill the allocated memory with zeroes to mimic calloc behaviour */
-  memset(ret, '\0', total_size);
-
   return ret;
 }
 
@@ -67,14 +61,7 @@ void *realloc(void *p, size_t s)
   xbt_mheap_t mdp = __mmalloc_current_heap ?: (xbt_mheap_t) mmalloc_preinit();
 
   LOCK(mdp);
-  if (s) {
-    if (p)
-      ret = mrealloc(mdp, p, s);
-    else
-      ret = mmalloc(mdp, s);
-  } else {
-    mfree(mdp, p);
-  }
+  ret = mrealloc(mdp, p, s);
   UNLOCK(mdp);
 
   return ret;
@@ -90,81 +77,6 @@ void free(void *p)
 }
 #endif
 
-/* Make sure it works with md==NULL */
-
-/* Safety gap from the heap's break address.
- * Try to increase this first if you experience strange errors under
- * valgrind. */
-#define HEAP_OFFSET   (128UL<<20)
-
-xbt_mheap_t mmalloc_get_default_md(void)
-{
-  xbt_assert(__mmalloc_default_mdp);
-  return __mmalloc_default_mdp;
-}
-
-static void mmalloc_fork_prepare(void)
-{
-  xbt_mheap_t mdp = NULL;
-  if ((mdp =__mmalloc_default_mdp)){
-    while(mdp){
-      LOCK(mdp);
-      if(mdp->fd >= 0){
-        mdp->refcount++;
-      }
-      mdp = mdp->next_mdesc;
-    }
-  }
-}
-
-static void mmalloc_fork_parent(void)
-{
-  xbt_mheap_t mdp = NULL;
-  if ((mdp =__mmalloc_default_mdp)){
-    while(mdp){
-      if(mdp->fd < 0)
-        UNLOCK(mdp);
-      mdp = mdp->next_mdesc;
-    }
-  }
-}
-
-static void mmalloc_fork_child(void)
-{
-  struct mdesc* mdp = NULL;
-  if ((mdp =__mmalloc_default_mdp)){
-    while(mdp){
-      UNLOCK(mdp);
-      mdp = mdp->next_mdesc;
-    }
-  }
-}
-
-/* Initialize the default malloc descriptor. */
-void *mmalloc_preinit(void)
-{
-  int res;
-  if (__mmalloc_default_mdp == NULL) {
-    unsigned long mask = ~((unsigned long)getpagesize() - 1);
-    void *addr = (void*)(((unsigned long)sbrk(0) + HEAP_OFFSET) & mask);
-    __mmalloc_default_mdp = mmalloc_attach(-1, addr);
-    /* Fixme? only the default mdp in protected against forks */
-    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);
-
-  return __mmalloc_default_mdp;
-}
-
-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);
-  mmalloc_detach_no_free(__mmalloc_default_mdp);
-}
 
 int mmalloc_compare_heap(xbt_mheap_t mdp1, xbt_mheap_t mdp2, void *std_heap_addr){
 
@@ -319,12 +231,12 @@ int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2, void *std_heap
   block_free1 = mdp1->heapindex; 
   block_free2 = mdp2->heapindex;
 
-  while(mdp1->heapinfo[block_free1].free.prev != 0){
-    block_free1 = mdp1->heapinfo[block_free1].free.prev;
+  while(mdp1->heapinfo[block_free1].free_block.prev != 0){
+    block_free1 = mdp1->heapinfo[block_free1].free_block.prev;
   }
 
-  while(mdp2->heapinfo[block_free2].free.prev != 0){
-    block_free2 = mdp1->heapinfo[block_free2].free.prev;
+  while(mdp2->heapinfo[block_free2].free_block.prev != 0){
+    block_free2 = mdp1->heapinfo[block_free2].free_block.prev;
   }
 
   if(block_free1 !=  block_free2){
@@ -338,7 +250,7 @@ int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2, void *std_heap
 
   first_block_free = block_free1;
 
-  if(mdp1->heapinfo[first_block_free].free.size != mdp2->heapinfo[first_block_free].free.size){ 
+  if(mdp1->heapinfo[first_block_free].free_block.size != mdp2->heapinfo[first_block_free].free_block.size){
     if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
       XBT_DEBUG("Different size (in blocks) of the first free cluster");
       errors++;
@@ -349,9 +261,9 @@ int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2, void *std_heap
 
   /* Check busy blocks (circular checking)*/
 
-  i = first_block_free + mdp1->heapinfo[first_block_free].free.size;
+  i = first_block_free + mdp1->heapinfo[first_block_free].free_block.size;
 
-  if(mdp1->heapinfo[first_block_free].free.next != mdp2->heapinfo[first_block_free].free.next){
+  if(mdp1->heapinfo[first_block_free].free_block.next != mdp2->heapinfo[first_block_free].free_block.next){
     if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
       XBT_DEBUG("Different next block free");
       errors++;
@@ -361,7 +273,7 @@ int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2, void *std_heap
   }
   
   block_free = first_block_free;
-  next_block_free = mdp1->heapinfo[first_block_free].free.next;
+  next_block_free = mdp1->heapinfo[first_block_free].free_block.next;
 
   if(next_block_free == 0)
     next_block_free = mdp1->heaplimit;
@@ -370,7 +282,7 @@ int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2, void *std_heap
 
     while(i<next_block_free){
 
-      if(mdp1->heapinfo[i].busy.type != mdp2->heapinfo[i].busy.type){
+      if(mdp1->heapinfo[i].type != mdp2->heapinfo[i].type){
        if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
          XBT_DEBUG("Different type of busy block");
          errors++;
@@ -382,9 +294,9 @@ int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2, void *std_heap
        addr_block1 = (char *)mdp1 + sizeof(struct mdesc) + ((i-1) * BLOCKSIZE); 
        addr_block2 = (char *)mdp2 + sizeof(struct mdesc) + ((i-1) * BLOCKSIZE); 
        
-       switch(mdp1->heapinfo[i].busy.type){
+       switch(mdp1->heapinfo[i].type){ //FIXME deal with type<0 == free
        case 0 :
-         if(mdp1->heapinfo[i].busy.info.block.size != mdp2->heapinfo[i].busy.info.block.size){
+         if(mdp1->heapinfo[i].busy_block.size != mdp2->heapinfo[i].busy_block.size){
            if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
              XBT_DEBUG("Different size of a large cluster");
              errors++;
@@ -392,20 +304,20 @@ int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2, void *std_heap
              return 1;
            }
          }else{
-           if(memcmp(addr_block1, addr_block2, (mdp1->heapinfo[i].busy.info.block.size * BLOCKSIZE)) != 0){
+           if(memcmp(addr_block1, addr_block2, (mdp1->heapinfo[i].busy_block.size * BLOCKSIZE)) != 0){
              if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){           
-               XBT_DEBUG("Different data in block %zu (size = %zu) (addr_block1 = %p (current = %p) - addr_block2 = %p)", i, mdp1->heapinfo[i].busy.info.block.size, addr_block1, (char *)std_heap_addr + sizeof(struct mdesc) + ((i-1) * BLOCKSIZE), addr_block2);
+               XBT_DEBUG("Different data in block %zu (size = %zu) (addr_block1 = %p (current = %p) - addr_block2 = %p)", i, mdp1->heapinfo[i].busy_block.size, addr_block1, (char *)std_heap_addr + sizeof(struct mdesc) + ((i-1) * BLOCKSIZE), addr_block2);
                errors++;
              }else{
                return 1;
              }
            } 
          }
-         i = i+mdp1->heapinfo[i].busy.info.block.size;
+         i = i+mdp1->heapinfo[i].busy_block.size;
 
          break;
        default :         
-         if(mdp1->heapinfo[i].busy.info.frag.nfree != mdp2->heapinfo[i].busy.info.frag.nfree){
+         if(mdp1->heapinfo[i].busy_frag.nfree != mdp2->heapinfo[i].busy_frag.nfree){
            if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
              XBT_DEBUG("Different free fragments in the fragmented block %zu", i);
              errors++;
@@ -413,7 +325,7 @@ int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2, void *std_heap
              return 1;
            }
          }else{
-           if(mdp1->heapinfo[i].busy.info.frag.first != mdp2->heapinfo[i].busy.info.frag.first){
+           if(mdp1->heapinfo[i].busy_frag.first != mdp2->heapinfo[i].busy_frag.first){
              if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
                XBT_DEBUG("Different first free fragments in the block %zu", i);
                errors++;
@@ -421,7 +333,7 @@ int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2, void *std_heap
                return 1;
              } 
            }else{
-             frag_size = pow(2,mdp1->heapinfo[i].busy.type);
+             frag_size = pow(2,mdp1->heapinfo[i].type);
              for(j=0 ; j< (BLOCKSIZE/frag_size); j++){
                if(memcmp((char *)addr_block1 + (j * frag_size), (char *)addr_block2 + (j * frag_size), frag_size) != 0){
                  if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
@@ -445,7 +357,7 @@ int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2, void *std_heap
 
     if( i != first_block_free){
 
-      if(mdp1->heapinfo[block_free].free.next != mdp2->heapinfo[block_free].free.next){
+      if(mdp1->heapinfo[block_free].free_block.next != mdp2->heapinfo[block_free].free_block.next){
        if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
          XBT_DEBUG("Different next block free");
          errors++;
@@ -454,16 +366,16 @@ int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2, void *std_heap
        }
       }
      
-      block_free = mdp1->heapinfo[block_free].free.next;
-      next_block_free = mdp1->heapinfo[block_free].free.next;
+      block_free = mdp1->heapinfo[block_free].free_block.next;
+      next_block_free = mdp1->heapinfo[block_free].free_block.next;
 
-      i = block_free + mdp1->heapinfo[block_free].free.size;
+      i = block_free + mdp1->heapinfo[block_free].free_block.size;
 
       if((next_block_free == 0) && (i != mdp1->heaplimit)){
 
        while(i < mdp1->heaplimit){
 
-         if(mdp1->heapinfo[i].busy.type != mdp2->heapinfo[i].busy.type){
+         if(mdp1->heapinfo[i].type != mdp2->heapinfo[i].type){
            if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
              XBT_DEBUG("Different type of busy block");
              errors++;
@@ -475,9 +387,9 @@ int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2, void *std_heap
            addr_block1 = (char *)mdp1 + sizeof(struct mdesc) + ((i-1) * BLOCKSIZE); 
            addr_block2 = (char *)mdp2 + sizeof(struct mdesc) + ((i-1) * BLOCKSIZE); 
        
-           switch(mdp1->heapinfo[i].busy.type){
+           switch(mdp1->heapinfo[i].type){
            case 0 :
-             if(mdp1->heapinfo[i].busy.info.block.size != mdp2->heapinfo[i].busy.info.block.size){
+             if(mdp1->heapinfo[i].busy_block.size != mdp2->heapinfo[i].busy_block.size){
                if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
                  XBT_DEBUG("Different size of a large cluster");
                  errors++;
@@ -485,7 +397,7 @@ int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2, void *std_heap
                  return 1;
                }
              }else{
-               if(memcmp(addr_block1, addr_block2, (mdp1->heapinfo[i].busy.info.block.size * BLOCKSIZE)) != 0){
+               if(memcmp(addr_block1, addr_block2, (mdp1->heapinfo[i].busy_block.size * BLOCKSIZE)) != 0){
                  if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){       
                    XBT_DEBUG("Different data in block %zu (addr_block1 = %p (current = %p) - addr_block2 = %p)", i, addr_block1, (char *)std_heap_addr + sizeof(struct mdesc) + ((i-1) * BLOCKSIZE), addr_block2);
                    errors++;
@@ -495,11 +407,11 @@ int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2, void *std_heap
                } 
              }
            
-             i = i+mdp1->heapinfo[i].busy.info.block.size;
+             i = i+mdp1->heapinfo[i].busy_block.size;
 
              break;
            default :     
-             if(mdp1->heapinfo[i].busy.info.frag.nfree != mdp2->heapinfo[i].busy.info.frag.nfree){
+             if(mdp1->heapinfo[i].busy_frag.nfree != mdp2->heapinfo[i].busy_frag.nfree){
                if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
                  XBT_DEBUG("Different free fragments in the fragmented block %zu", i);
                  errors++;
@@ -507,7 +419,7 @@ int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2, void *std_heap
                  return 1;
                }
              }else{
-               if(mdp1->heapinfo[i].busy.info.frag.first != mdp2->heapinfo[i].busy.info.frag.first){
+               if(mdp1->heapinfo[i].busy_frag.first != mdp2->heapinfo[i].busy_frag.first){
                  if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
                    XBT_DEBUG("Different first free fragments in the block %zu", i);
                    errors++;
@@ -515,7 +427,7 @@ int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2, void *std_heap
                    return 1;
                  } 
                }else{
-                 frag_size = pow(2,mdp1->heapinfo[i].busy.type);
+                 frag_size = pow(2,mdp1->heapinfo[i].type);
                  for(j=0 ; j< (BLOCKSIZE/frag_size); j++){
                    if(memcmp((char *)addr_block1 + (j * frag_size), (char *)addr_block2 + (j * frag_size), frag_size) != 0){
                      if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
@@ -548,14 +460,3 @@ int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2, void *std_heap
 void mmalloc_display_info_heap(xbt_mheap_t h){
 
 }  
-
-/* Useless prototype to make gcc happy */
-void *valloc(size_t size);
-
-void *valloc(size_t size)
-{ //FIXME: won't work
-  return mvalloc(NULL, size);
-}
-
-  
-