diff options
author | Rich Felker <dalias@aerifal.cx> | 2011-03-30 09:29:49 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2011-03-30 09:29:49 -0400 |
commit | 620a1346382f9e10b516bc168f86d499b6716769 (patch) | |
tree | 6dab9801089447ca15d25620d7d002a461079dca /src/malloc/__simple_malloc.c | |
parent | 02084109f0f0d6e0a7fe4a8cb3a90a422725e264 (diff) | |
download | musl-620a1346382f9e10b516bc168f86d499b6716769.tar.gz musl-620a1346382f9e10b516bc168f86d499b6716769.tar.xz musl-620a1346382f9e10b516bc168f86d499b6716769.zip |
rename __simple_malloc.c to lite_malloc.c - yes this affects behavior!
why does this affect behavior? well, the linker seems to traverse archive files starting from its current position when resolving symbols. since calloc.c comes alphabetically (and thus in sequence in the archive file) between __simple_malloc.c and malloc.c, attempts to resolve the "malloc" symbol for use by calloc.c were pulling in the full malloc.c implementation rather than the __simple_malloc.c implementation. as of now, lite_malloc.c and malloc.c are adjacent in the archive and in the correct order, so malloc.c should never be used to resolve "malloc" unless it's already needed to resolve another symbol ("free" or "realloc").
Diffstat (limited to 'src/malloc/__simple_malloc.c')
-rw-r--r-- | src/malloc/__simple_malloc.c | 46 |
1 files changed, 0 insertions, 46 deletions
diff --git a/src/malloc/__simple_malloc.c b/src/malloc/__simple_malloc.c deleted file mode 100644 index c8293908..00000000 --- a/src/malloc/__simple_malloc.c +++ /dev/null @@ -1,46 +0,0 @@ -#include <stdlib.h> -#include <stdint.h> -#include <limits.h> -#include <errno.h> -#include "libc.h" - -uintptr_t __brk(uintptr_t); - -#define ALIGN 16 - -void *__simple_malloc(size_t n) -{ - static uintptr_t cur, brk; - uintptr_t base, new; - static int lock; - size_t align=1; - - if (!n) n++; - if (n > SIZE_MAX/2) goto toobig; - - while (align<n && align<ALIGN) - align += align; - n = n + align - 1 & -align; - - LOCK(&lock); - if (!cur) cur = brk = __brk(0)+16; - base = cur + align-1 & -align; - if (n > SIZE_MAX - PAGE_SIZE - base) goto fail; - if (base+n > brk) { - new = base+n + PAGE_SIZE-1 & -PAGE_SIZE; - if (__brk(new) != new) goto fail; - brk = new; - } - cur = base+n; - UNLOCK(&lock); - - return (void *)base; - -fail: - UNLOCK(&lock); -toobig: - errno = ENOMEM; - return 0; -} - -weak_alias(__simple_malloc, malloc); |