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