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,