diff options
-rw-r--r-- | libc/stdlib/malloc/free.c | 11 | ||||
-rw-r--r-- | libc/stdlib/malloc/heap_free.c | 14 | ||||
-rw-r--r-- | libc/stdlib/malloc/malloc.c | 7 |
3 files changed, 17 insertions, 15 deletions
diff --git a/libc/stdlib/malloc/free.c b/libc/stdlib/malloc/free.c index 3074ff5e6..6de5237dc 100644 --- a/libc/stdlib/malloc/free.c +++ b/libc/stdlib/malloc/free.c @@ -26,6 +26,7 @@ free (void *mem) { size_t size; struct heap_free_area *fa; + struct heap *heap = &__malloc_heap; mem -= MALLOC_ALIGNMENT; size = *(size_t *)mem; @@ -36,7 +37,7 @@ free (void *mem) __malloc_lock (); /* Put MEM back in the heap, and get the free-area it was placed in. */ - fa = __heap_free (&__malloc_heap, mem, size); + fa = __heap_free (heap, mem, size); /* See if the free-area FA has grown big enough that it should be unmapped. */ @@ -79,7 +80,7 @@ free (void *mem) start, end, end - start); /* Remove FA from the heap. */ - __heap_unlink_free_area (&__malloc_heap, fa); + __heap_unlink_free_area (heap, fa); if (!fa->next && !fa->prev) /* We want to avoid the heap from losing all memory, so reserve @@ -90,7 +91,7 @@ free (void *mem) /* Put the reserved memory back in the heap; we asssume that MALLOC_UNMAP_THRESHOLD is greater than MALLOC_MIN_SIZE, so we use the latter unconditionally here. */ - __heap_free (&__malloc_heap, (void *)start, MALLOC_MIN_SIZE); + __heap_free (heap, (void *)start, MALLOC_MIN_SIZE); start += MALLOC_MIN_SIZE; } @@ -119,13 +120,13 @@ free (void *mem) { if (unmap_start - start < HEAP_MIN_FREE_AREA_SIZE) unmap_start += MALLOC_PAGE_SIZE; - __heap_free (&__malloc_heap, (void *)start, unmap_start - start); + __heap_free (heap, (void *)start, unmap_start - start); } if (end > unmap_end) { if (end - unmap_end < HEAP_MIN_FREE_AREA_SIZE) unmap_end -= MALLOC_PAGE_SIZE; - __heap_free (&__malloc_heap, (void *)unmap_end, end - unmap_end); + __heap_free (heap, (void *)unmap_end, end - unmap_end); } /* Release the malloc lock before we do the system call. */ diff --git a/libc/stdlib/malloc/heap_free.c b/libc/stdlib/malloc/heap_free.c index 6084b43c3..272327260 100644 --- a/libc/stdlib/malloc/heap_free.c +++ b/libc/stdlib/malloc/heap_free.c @@ -31,13 +31,17 @@ __heap_free (struct heap *heap, void *mem, size_t size) size_t fa_size = fa->size; void *fa_mem = HEAP_FREE_AREA_START (fa); - if (end == fa_mem) + if (fa_mem > end) + /* We've reached the right spot in the free-list without finding an + adjacent free-area, so continue below to add a new free area. */ + break; + else if (fa_mem == end) /* FA is just after MEM, grow down to encompass it. */ { fa_size += size; /* See if FA can now be merged with its predecessor. */ - if (prev_fa && fa_mem - size == HEAP_FREE_AREA_END (prev_fa)) + if (prev_fa && mem == HEAP_FREE_AREA_END (prev_fa)) /* Yup; merge PREV_FA's info into FA. */ { fa_size += prev_fa->size; @@ -56,7 +60,7 @@ __heap_free (struct heap *heap, void *mem, size_t size) fa_size += size; /* See if FA can now be merged with its successor. */ - if (next_fa && mem + size == HEAP_FREE_AREA_START (next_fa)) + if (next_fa && end == HEAP_FREE_AREA_START (next_fa)) /* Yup; merge FA's info into NEXT_FA. */ { fa_size += next_fa->size; @@ -78,10 +82,6 @@ __heap_free (struct heap *heap, void *mem, size_t size) goto done; } - else if (fa_mem > mem) - /* We've reached the right spot in the free-list without finding an - adjacent free-area, so continue below to add a new free area. */ - break; } /* Make MEM into a new free-list entry. */ diff --git a/libc/stdlib/malloc/malloc.c b/libc/stdlib/malloc/malloc.c index 2ec12218c..bb1e07dfb 100644 --- a/libc/stdlib/malloc/malloc.c +++ b/libc/stdlib/malloc/malloc.c @@ -36,6 +36,7 @@ void * malloc (size_t size) { void *mem; + struct heap *heap = &__malloc_heap; MALLOC_DEBUG ("malloc: %d bytes\n", size); @@ -44,7 +45,7 @@ malloc (size_t size) __malloc_lock (); - mem = __heap_alloc (&__malloc_heap, &size); + mem = __heap_alloc (heap, &size); if (! mem) /* We couldn't allocate from the heap, so get some more memory from the system, add it to the heap, and try again. */ @@ -108,10 +109,10 @@ malloc (size_t size) (long)block, (long)block + block_size, block_size); /* Put BLOCK into the heap. */ - __heap_free (&__malloc_heap, block, block_size); + __heap_free (heap, block, block_size); /* Try again to allocate. */ - mem = __heap_alloc (&__malloc_heap, &size); + mem = __heap_alloc (heap, &size); } } |