split internal lock API out of libc.h, creating lock.h
[musl.git] / src / malloc / lite_malloc.c
blob050d84f648bcc690f97d704ce7232089b9a256f0
1 #include <stdlib.h>
2 #include <stdint.h>
3 #include <limits.h>
4 #include <errno.h>
5 #include "lock.h"
6 #include "malloc_impl.h"
8 #define ALIGN 16
10 static void *__simple_malloc(size_t n)
12 static char *cur, *end;
13 static volatile int lock[1];
14 size_t align=1, pad;
15 void *p;
17 if (!n) n++;
18 while (align<n && align<ALIGN)
19 align += align;
21 LOCK(lock);
23 pad = -(uintptr_t)cur & align-1;
25 if (n <= SIZE_MAX/2 + ALIGN) n += pad;
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;
34 if (new != end) {
35 cur = new;
36 n -= pad;
37 pad = 0;
39 end = new + m;
42 p = cur + pad;
43 cur += n;
44 UNLOCK(lock);
45 return p;
48 weak_alias(__simple_malloc, malloc);
50 static void *__simple_calloc(size_t m, size_t n)
52 if (n && m > (size_t)-1/n) {
53 errno = ENOMEM;
54 return 0;
56 return __simple_malloc(n * m);
59 weak_alias(__simple_calloc, calloc);