X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fmalloc%2Flite_malloc.c;h=050d84f648bcc690f97d704ce7232089b9a256f0;hb=2412638bb39eb799b2600393bbd71cca8ae96bb2;hp=7643fc2c993b1e331f15c3fb5b2bb06d26d0ec17;hpb=56fbaa3bbe73f12af2bfbbcf2adb196e6f9fe264;p=musl diff --git a/src/malloc/lite_malloc.c b/src/malloc/lite_malloc.c index 7643fc2c..050d84f6 100644 --- a/src/malloc/lite_malloc.c +++ b/src/malloc/lite_malloc.c @@ -2,45 +2,58 @@ #include #include #include -#include "libc.h" - -uintptr_t __brk(uintptr_t); +#include "lock.h" +#include "malloc_impl.h" #define ALIGN 16 -void *__simple_malloc(size_t n) +static void *__simple_malloc(size_t n) { - static uintptr_t cur, brk; - uintptr_t base, new; - static volatile int lock[2]; - size_t align=1; + static char *cur, *end; + static volatile int lock[1]; + size_t align=1, pad; + void *p; if (!n) n++; - if (n > SIZE_MAX/2) goto toobig; - while (align 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; + pad = -(uintptr_t)cur & align-1; + + if (n <= SIZE_MAX/2 + ALIGN) n += pad; + + if (n > end-cur) { + size_t m = n; + char *new = __expand_heap(&m); + if (!new) { + UNLOCK(lock); + return 0; + } + if (new != end) { + cur = new; + n -= pad; + pad = 0; + } + end = new + m; + } -fail: + p = cur + pad; + cur += n; UNLOCK(lock); -toobig: - errno = ENOMEM; - return 0; + return p; } weak_alias(__simple_malloc, malloc); + +static void *__simple_calloc(size_t m, size_t n) +{ + if (n && m > (size_t)-1/n) { + errno = ENOMEM; + return 0; + } + return __simple_malloc(n * m); +} + +weak_alias(__simple_calloc, calloc);