• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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"
7 
8 #define ALIGN 16
9 
__simple_malloc(size_t n)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 
__simple_calloc(size_t m,size_t n)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);
60