Try to allocate to the next power of 2, instead of just aligning
authorceriel <none@none>
Fri, 10 Feb 1989 09:18:19 +0000 (09:18 +0000)
committerceriel <none@none>
Fri, 10 Feb 1989 09:18:19 +0000 (09:18 +0000)
with GRABSIZE; This way, malloc(1000000) followed by free() followed by
another malloc(1000000) will result in the same block being allocated,
because first_present will now find it

modules/src/malloc/mal.c

index cf89244..44a1926 100644 (file)
@@ -67,10 +67,10 @@ malloc(n)
                assert(n1 < (1 << LOG_MAX_SIZE));
                min_class = 0;
 
-               while (n1 >= MIN_SIZE) {
+               do {
                        n1 >>= 1;
                        min_class++;
-               }
+               } while (n1 >= MIN_SIZE);
        }
 
        if (min_class >= MAX_FLIST)
@@ -81,7 +81,8 @@ malloc(n)
                register char *p;
 #define        GRABSIZE        4096            /* Power of 2 */
                register unsigned int req =
-                       (n+mallink_size()+GRABSIZE-1)&~(GRABSIZE-1);
+                       ((MIN_SIZE<<min_class)+ mallink_size() + GRABSIZE - 1) &
+                               ~(GRABSIZE-1);
        
                if (!ml_last)   {
                        /* first align SBRK() */