lite_malloc.c 757 B

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