slab.hpp 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #pragma once
  2. #include <cstddef>
  3. #include <type_traits>
  4. #include <stdint.h>
  5. #include "paging.hpp"
  6. #include "phys.hpp"
  7. namespace kernel::mem {
  8. struct slab_cache;
  9. struct slab_head {
  10. slab_cache* cache;
  11. slab_head* next;
  12. slab_head* prev;
  13. void* free;
  14. unsigned int free_count;
  15. unsigned int obj_size;
  16. };
  17. struct slab_cache {
  18. slab_head* slabs_empty;
  19. slab_head* slabs_partial;
  20. slab_head* slabs_full;
  21. std::size_t obj_size;
  22. };
  23. template <typename T>
  24. class slab_allocator {
  25. using value_type = T;
  26. using propagate_on_container_move_assignment = std::true_type;
  27. // throws std::bad_alloc
  28. [[nodiscard]] constexpr T* allocate(std::size_t n)
  29. { return static_cast<T*>(::operator new(n * sizeof(T))); }
  30. // TODO: check allocated size
  31. constexpr void deallocate(T* ptr, std::size_t)
  32. { ::operator delete(ptr); }
  33. };
  34. void init_slab_cache(slab_cache* cache, std::size_t obj_size);
  35. void slab_add_page(slab_cache* cache, paging::pfn_t pfn);
  36. void* slab_alloc(slab_cache* cache);
  37. void slab_free(void* ptr);
  38. } // namespace kernel::mem