BSMMAlloc.cpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsMMAlloc.h"
  4. #include <stdlib.h>
  5. #include <string.h>
  6. typedef struct tagMMAllocHeader MMAllocHeader;
  7. struct tagMMAllocHeader
  8. {
  9. MMAllocHeader* next;
  10. MMAllocHeader* prev;
  11. };
  12. void* mmalloc_new_context()
  13. {
  14. MMAllocHeader* header = (MMAllocHeader*)malloc(sizeof(MMAllocHeader));
  15. header->next = 0;
  16. header->prev = 0;
  17. return header;
  18. }
  19. void mmalloc_free_context(void* context)
  20. {
  21. MMAllocHeader* header = (MMAllocHeader*)context;
  22. while (header->next != 0)
  23. mmfree((char*)header->next + sizeof(MMAllocHeader));
  24. free(header);
  25. }
  26. void* mmalloc(void* context, int size)
  27. {
  28. void* buffer = malloc(size + sizeof(MMAllocHeader));
  29. MMAllocHeader* header = (MMAllocHeader*)buffer;
  30. MMAllocHeader* parent = (MMAllocHeader*)context;
  31. header->next = parent->next;
  32. if (parent->next)
  33. parent->next->prev = header;
  34. header->prev = parent;
  35. parent->next = header;
  36. return (char*)buffer + sizeof(MMAllocHeader);
  37. }
  38. void mmfree(void* ptr)
  39. {
  40. void* buffer = (char*)ptr - sizeof(MMAllocHeader);
  41. MMAllocHeader* header = (MMAllocHeader*)buffer;
  42. if (header->prev)
  43. header->prev->next = header->next;
  44. if (header->next)
  45. header->next->prev = header->prev;
  46. free(buffer);
  47. }
  48. char* mmalloc_strdup(void* context, const char* input)
  49. {
  50. size_t length = strlen(input);
  51. char* output = (char*)mmalloc(context, (int)(sizeof(char) * (length + 1)));
  52. memcpy(output, input, length);
  53. output[length] = '\0';
  54. return output;
  55. }