move declarations for malloc internals to malloc_impl.h
[oweals/musl.git] / src / malloc / lite_malloc.c
1 #include <stdlib.h>
2 #include <stdint.h>
3 #include <limits.h>
4 #include <errno.h>
5 #include "libc.h"
6 #include "malloc_impl.h"
7
8 #define ALIGN 16
9
10 static void *__simple_malloc(size_t n)
11 {
12         static char *cur, *end;
13         static volatile int lock[1];
14         size_t align=1, pad;
15         void *p;
16
17         if (!n) n++;
18         while (align<n && align<ALIGN)
19                 align += align;
20
21         LOCK(lock);
22
23         pad = -(uintptr_t)cur & align-1;
24
25         if (n <= SIZE_MAX/2 + ALIGN) n += pad;
26
27         if (n > end-cur) {
28                 size_t m = n;
29                 char *new = __expand_heap(&m);
30                 if (!new) {
31                         UNLOCK(lock);
32                         return 0;
33                 }
34                 if (new != end) {
35                         cur = new;
36                         n -= pad;
37                         pad = 0;
38                 }
39                 end = new + m;
40         }
41
42         p = cur + pad;
43         cur += n;
44         UNLOCK(lock);
45         return p;
46 }
47
48 weak_alias(__simple_malloc, malloc);
49
50 static void *__simple_calloc(size_t m, size_t n)
51 {
52         if (n && m > (size_t)-1/n) {
53                 errno = ENOMEM;
54                 return 0;
55         }
56         return __simple_malloc(n * m);
57 }
58
59 weak_alias(__simple_calloc, calloc);