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