/vm/free_list.hpp

http://github.com/abeaumont/factor · C++ Header · 54 lines · 44 code · 10 blank · 0 comment · 1 complexity · af3a54bec324a97f821e932d96185761 MD5 · raw file

  1. namespace factor
  2. {
  3. static const cell free_list_count = 32;
  4. static const cell allocation_page_size = 1024;
  5. struct free_heap_block
  6. {
  7. cell header;
  8. bool free_p() const
  9. {
  10. return (header & 1) == 1;
  11. }
  12. cell size() const
  13. {
  14. cell size = header & ~7;
  15. FACTOR_ASSERT(size > 0);
  16. return size;
  17. }
  18. void make_free(cell size)
  19. {
  20. FACTOR_ASSERT(size > 0);
  21. header = size | 1;
  22. }
  23. };
  24. struct block_size_compare {
  25. bool operator()(free_heap_block *a, free_heap_block *b) const
  26. {
  27. return a->size() < b->size();
  28. }
  29. };
  30. typedef std::multiset<free_heap_block *, block_size_compare> large_block_set;
  31. struct free_list {
  32. std::vector<free_heap_block *> small_blocks[free_list_count];
  33. large_block_set large_blocks;
  34. cell free_block_count;
  35. cell free_space;
  36. void clear_free_list();
  37. void initial_free_list(cell start, cell end, cell occupied);
  38. void add_to_free_list(free_heap_block *block);
  39. free_heap_block *find_free_block(cell size);
  40. free_heap_block *split_free_block(free_heap_block *block, cell size);
  41. bool can_allot_p(cell size);
  42. cell largest_free_block();
  43. };
  44. }