| Index: fusl/src/malloc/lite_malloc.c
|
| diff --git a/fusl/src/malloc/lite_malloc.c b/fusl/src/malloc/lite_malloc.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a7e4a9f7b511bdbf2db4d5018e5088c19ed38570
|
| --- /dev/null
|
| +++ b/fusl/src/malloc/lite_malloc.c
|
| @@ -0,0 +1,50 @@
|
| +#include <stdlib.h>
|
| +#include <stdint.h>
|
| +#include <limits.h>
|
| +#include <errno.h>
|
| +#include "libc.h"
|
| +
|
| +#define ALIGN 16
|
| +
|
| +void *__expand_heap(size_t *);
|
| +
|
| +static void *__simple_malloc(size_t n)
|
| +{
|
| + static char *cur, *end;
|
| + static volatile int lock[2];
|
| + size_t align=1, pad;
|
| + void *p;
|
| +
|
| + if (!n) n++;
|
| + while (align<n && align<ALIGN)
|
| + align += align;
|
| +
|
| + LOCK(lock);
|
| +
|
| + 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;
|
| + }
|
| +
|
| + p = cur + pad;
|
| + cur += n;
|
| + UNLOCK(lock);
|
| + return p;
|
| +}
|
| +
|
| +weak_alias(__simple_malloc, malloc);
|
| +weak_alias(__simple_malloc, __malloc0);
|
|
|