memorypool.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include "pocketpy/common/memorypool.h"
  2. #include "pocketpy/pocketpy.h"
  3. #include <stdlib.h>
  4. #include <stdbool.h>
  5. void FixedMemoryPool__ctor(FixedMemoryPool* self, int BlockSize, int BlockCount) {
  6. self->BlockSize = BlockSize;
  7. self->BlockCount = BlockCount;
  8. self->exceeded_bytes = 0;
  9. self->data = PK_MALLOC(BlockSize * BlockCount);
  10. self->data_end = self->data + BlockSize * BlockCount;
  11. self->_free_list = PK_MALLOC(sizeof(void*) * BlockCount);
  12. self->_free_list_end = self->_free_list;
  13. for(int i = 0; i < BlockCount; i++) {
  14. self->_free_list[i] = self->data + i * BlockSize;
  15. }
  16. }
  17. void FixedMemoryPool__dtor(FixedMemoryPool* self) {
  18. PK_FREE(self->_free_list);
  19. PK_FREE(self->data);
  20. }
  21. void* FixedMemoryPool__alloc(FixedMemoryPool* self) {
  22. if(self->_free_list_end != self->_free_list) {
  23. self->_free_list_end--;
  24. return *self->_free_list_end;
  25. } else {
  26. self->exceeded_bytes += self->BlockSize;
  27. return PK_MALLOC(self->BlockSize);
  28. }
  29. }
  30. void FixedMemoryPool__dealloc(FixedMemoryPool* self, void* p) {
  31. bool is_valid = (char*)p >= self->data && (char*)p < self->data_end;
  32. if(is_valid) {
  33. *self->_free_list_end = p;
  34. self->_free_list_end++;
  35. } else {
  36. self->exceeded_bytes -= self->BlockSize;
  37. PK_FREE(p);
  38. }
  39. }
  40. // static int FixedMemoryPool__used_bytes(FixedMemoryPool* self) {
  41. // return (self->_free_list_end - self->_free_list) * self->BlockSize;
  42. // }
  43. // static int FixedMemoryPool__total_bytes(FixedMemoryPool* self) {
  44. // return self->BlockCount * self->BlockSize;
  45. // }