1#pragma once
2
3#ifdef __cplusplus
4extern "C" {
5#endif
6
7struct _FsbaPageHeader;
8typedef struct _FsbaPageHeader FsbaPageHeader;
9
10typedef struct {
11 unsigned block_size; // block alignment equals to block_size
12 unsigned blocks_per_page; // ??? (sys_page_size - align(sizeof(FsbArena) + bitmap_size * sizeof(WORD), block_size)) / block_size
13 unsigned bitmap_size; // in words
14 FsbaPageHeader* avail_pages; // list of pages with free blocks, one page is always allocated
15 FsbaPageHeader* full_pages; // list of full pages
16} FsbArena;
17
18
19bool _init_fsb_arena(FsbArena* arena, unsigned block_size, unsigned block_alignment);
20
21#define init_fsb_arena(arena, data_type) _init_fsb_arena((arena), sizeof(data_type), alignof(data_type))
22
23void destroy_fsb_arena(FsbArena* arena);
24
25void* fsb_arena_allocate(FsbArena* arena);
26void fsb_arena_release(void** block_ptr);
27
28typedef void (*FsbArenaWalkCb)(FsbArena* arena, void* cb_data, void* block_ptr);
29
30void fsb_arena_walk(FsbArena* arena, FsbArenaWalkCb callback, void* cb_data);
31/*
32 * Invoke `callback` for each allocated block.
33 * The block can be released from the callback.
34 */
35
36void dump_fsb_arena(FsbArena* arena);
37
38
39#ifdef __cplusplus
40}
41#endif