Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
document one more function
[simgrid.git] / src / xbt / mmalloc / mmalloc.c
index 23db293..355b24c 100644 (file)
@@ -32,7 +32,8 @@ static void *align(struct mdesc *mdp, size_t size)
    * complete the reservation by also asking for the full lastest block.
    *
    * Also, the returned block is aligned to the end of block (but I've
-   * no fucking idea of why, actually -- http://abstrusegoose.com/432).
+   * no fucking idea of why, actually -- http://abstrusegoose.com/432 --
+   * but not doing so seems to lead to issues).
    */
   adj = RESIDUAL(result, BLOCKSIZE);
   if (adj != 0) {
@@ -75,26 +76,25 @@ static void *register_morecore(struct mdesc *mdp, size_t size)
     return (NULL);
   }
 
-  /* Check if we need to grow the info table.  */
+  /* Check if we need to grow the info table (in a multiplicative manner)  */
   if ((size_t) BLOCK((char *) result + size) > mdp->heapsize) {
+
     newsize = mdp->heapsize;
-    while ((size_t) BLOCK((char *) result + size) > newsize) {
+    while ((size_t) BLOCK((char *) result + size) > newsize)
       newsize *= 2;
-    }
-    newinfo = (malloc_info *) align(mdp, newsize * sizeof(malloc_info));
-    if (newinfo == NULL) {
-      mmorecore(mdp, -size);
-      return (NULL);
-    }
-    memset((void *) newinfo, 0, newsize * sizeof(malloc_info));
-    memcpy((void *) newinfo, (void *) mdp->heapinfo,
-           mdp->heapsize * sizeof(malloc_info));
+
+    /* Copy old info into new location */
     oldinfo = mdp->heapinfo;
+    newinfo = (malloc_info *) align(mdp, newsize * sizeof(malloc_info));
+    memset(newinfo, 0, newsize * sizeof(malloc_info));
+    memcpy(newinfo, oldinfo, mdp->heapsize * sizeof(malloc_info));
+    mdp->heapinfo = newinfo;
+
+    /* mark the space previously occupied by the block info as free by first marking it
+     * as occupied in the regular way, and then freing it */
     newinfo[BLOCK(oldinfo)].busy.type = 0;
-    newinfo[BLOCK(oldinfo)].busy.info.block.size
-        = BLOCKIFY(mdp->heapsize * sizeof(malloc_info));
+    newinfo[BLOCK(oldinfo)].busy.info.block.size = BLOCKIFY(mdp->heapsize * sizeof(malloc_info));
     newinfo[BLOCK(oldinfo)].busy.info.block.busy_size = size;
-    mdp->heapinfo = newinfo;
     __mmalloc_free(mdp, (void *) oldinfo);
     mdp->heapsize = newsize;
   }