18 #ifndef _BOILERPLATE_HEAPMEM_H 19 #define _BOILERPLATE_HEAPMEM_H 21 #include <sys/types.h> 24 #include <boilerplate/list.h> 25 #include <boilerplate/lock.h> 26 #include <boilerplate/avl.h> 28 #define HEAPMEM_PAGE_SHIFT 9 29 #define HEAPMEM_PAGE_SIZE (1UL << HEAPMEM_PAGE_SHIFT) 30 #define HEAPMEM_PAGE_MASK (~(HEAPMEM_PAGE_SIZE - 1)) 31 #define HEAPMEM_MIN_LOG2 4 36 #define HEAPMEM_MAX (HEAPMEM_PAGE_SHIFT - HEAPMEM_MIN_LOG2) 37 #define HEAPMEM_MIN_ALIGN (1U << HEAPMEM_MIN_LOG2) 39 #define HEAPMEM_MAX_EXTSZ (4294967295U - HEAPMEM_PAGE_SIZE + 1) 41 #define HEAPMEM_PGENT_BITS (32 - HEAPMEM_PAGE_SHIFT) 44 #define HEAPMEM_PGMAP_BYTES sizeof(struct heapmem_pgentry) 46 struct heapmem_pgentry {
48 unsigned int prev : HEAPMEM_PGENT_BITS;
49 unsigned int next : HEAPMEM_PGENT_BITS;
51 unsigned int type : 6;
70 struct heapmem_range {
71 struct avlh addr_node;
72 struct avlh size_node;
76 struct heapmem_extent {
82 struct heapmem_pgentry pagemap[0];
87 struct pvlistobj extents;
92 uint32_t buckets[HEAPMEM_MAX];
95 #define __HEAPMEM_MAP_SIZE(__nrpages) \ 96 ((__nrpages) * HEAPMEM_PGMAP_BYTES) 98 #define __HEAPMEM_ARENA_SIZE(__size) \ 100 __align_to(sizeof(struct heapmem_extent) + \ 101 __HEAPMEM_MAP_SIZE((__size) >> HEAPMEM_PAGE_SHIFT), \ 109 #define HEAPMEM_ARENA_SIZE(__user_size) \ 110 __HEAPMEM_ARENA_SIZE(__align_to(__user_size, HEAPMEM_PAGE_SIZE)) 116 int heapmem_init(
struct heap_memory *heap,
117 void *mem,
size_t size);
119 int heapmem_extend(
struct heap_memory *heap,
120 void *mem,
size_t size);
122 void heapmem_destroy(
struct heap_memory *heap);
124 void *heapmem_alloc(
struct heap_memory *heap,
125 size_t size) __alloc_size(2);
127 int heapmem_free(
struct heap_memory *heap,
131 size_t heapmem_arena_size(
const struct heap_memory *heap)
133 return heap->arena_size;
137 size_t heapmem_usable_size(
const struct heap_memory *heap)
139 return heap->usable_size;
143 size_t heapmem_used_size(
const struct heap_memory *heap)
145 return heap->used_size;
148 ssize_t heapmem_check(
struct heap_memory *heap,