18#ifndef _BOILERPLATE_HEAPMEM_H
19#define _BOILERPLATE_HEAPMEM_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)
46struct heapmem_pgentry {
48 unsigned int prev : HEAPMEM_PGENT_BITS;
49 unsigned int next : HEAPMEM_PGENT_BITS;
51 unsigned int type : 6;
71 struct avlh addr_node;
72 struct avlh size_node;
76struct 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))
116int heapmem_init(
struct heap_memory *heap,
117 void *mem,
size_t size);
119int heapmem_extend(
struct heap_memory *heap,
120 void *mem,
size_t size);
122void heapmem_destroy(
struct heap_memory *heap);
124void *heapmem_alloc(
struct heap_memory *heap,
125 size_t size) __alloc_size(2);
127int heapmem_free(
struct heap_memory *heap,
131size_t heapmem_arena_size(
const struct heap_memory *heap)
133 return heap->arena_size;
137size_t heapmem_usable_size(
const struct heap_memory *heap)
139 return heap->usable_size;
143size_t heapmem_used_size(
const struct heap_memory *heap)
145 return heap->used_size;
148ssize_t heapmem_check(
struct heap_memory *heap,