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