tralloc.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include "tralloc.h"
  2. static size_t heapsiz = 0, heaplim = 0;
  3. size_t tr_siz()
  4. {
  5. return heapsiz;
  6. }
  7. size_t tr_limit()
  8. {
  9. return heaplim;
  10. }
  11. size_t tr_setlimit(size_t n)
  12. {
  13. assert(heapsiz <= n);
  14. return (heaplim = n);
  15. }
  16. size_t tr_allocsiz(void *ptr)
  17. {
  18. return ((size_t *)ptr)[-1];
  19. }
  20. void *tr_malloc(size_t n)
  21. {
  22. size_t *ptr;
  23. assert(n);
  24. n += sizeof(size_t);
  25. if (heaplim > 0) assert(heapsiz + n <= heaplim);
  26. ptr = (size_t *)malloc(n);
  27. heapsiz += n;
  28. ptr[0] = n;
  29. return &ptr[1];
  30. }
  31. void *tr_calloc(size_t num, size_t n)
  32. {
  33. size_t *ptr, psiz;
  34. assert(n && num);
  35. psiz = (num * n) + sizeof(size_t);
  36. if (heaplim > 0) assert(heapsiz + psiz <= heaplim);
  37. ptr = (size_t *)calloc(1, psiz);
  38. ptr[0] = psiz;
  39. return &ptr[1];
  40. }
  41. void *tr_realloc(void *ptr, size_t n)
  42. {
  43. size_t *ret, m = tr_allocsiz(ptr);
  44. n += sizeof(size_t);
  45. if (heaplim > 0) assert(heapsiz + (-m + n) <= heaplim);
  46. ret = (size_t *)realloc((size_t *)ptr-1, n);
  47. assert(ret != NULL);
  48. heapsiz += (-m + n);
  49. ret[0] = n;
  50. return &ret[1];
  51. }
  52. void tr_free(void *ptr)
  53. {
  54. size_t n = ((size_t *)ptr)[-1];
  55. if (heaplim > 0) assert(heapsiz - n >= heaplim);
  56. heapsiz -= n;
  57. free((size_t *)ptr-1);
  58. }