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)10static 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)50static 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