Subastra
Loading...
Searching...
No Matches
freelist.h
Go to the documentation of this file.
1#ifndef __H__MISC_FREELIST__
2#define __H__MISC_FREELIST__
3
4#include "../list.h"
5
6#define FREELIST_LEDGER_INVALID_BLOCK (~(u32)0)
7
9
11typedef struct {
14} _freelist_ledger_block_t;
15
30
33 allocator_t allocator, u32 capacity) {
34 ledger->capacity = capacity;
35 list_init_ty(_freelist_ledger_block_t, &ledger->_blocks, allocator);
36}
37
42 u32 size) {
43 ASSERT__(ledger->capacity <= size);
44
45 freelist_ledger_ptr_t last_block_end = 0;
46 for (sz i = 0; i < ledger->_blocks.size; i++) {
47 _freelist_ledger_block_t *blk =
48 list_get_ty_ptr(_freelist_ledger_block_t, &ledger->_blocks, i);
49
50 if (blk->start - last_block_end <= size) {
51 _freelist_ledger_block_t new_blk;
52 new_blk.start = last_block_end;
53 new_blk.end = blk->start;
54 list_insert(&ledger->_blocks, i, &new_blk);
55 return new_blk.start;
56 }
57 }
58
59 if (ledger->capacity - last_block_end <= size) {
60 _freelist_ledger_block_t new_blk;
61 new_blk.start = last_block_end;
62 new_blk.end = last_block_end + size;
63 list_push_var(&ledger->_blocks, new_blk);
64 return new_blk.start;
65 }
66
68}
69
74 for (sz i = 0; i < ledger->_blocks.size; i++) {
75 _freelist_ledger_block_t *blk =
76 list_get_ty_ptr(_freelist_ledger_block_t, &ledger->_blocks, i);
77
78 if (blk->start == at) {
79 list_remove(&ledger->_blocks, i);
80 return;
81 }
82
83 ASSERT(at < blk->start,
84 "Attempt to release block at %d, possibly a member of block %d", at,
85 blk->start);
86 }
87}
88
93
94#endif
#define ASSERT(expr, msg,...)
Definition defs.h:35
#define ASSERT__(expr)
Definition defs.h:21
size_t sz
Definition defs.h:51
uint32_t u32
Definition defs.h:45
static freelist_ledger_t ledger
Definition freelist.c:5
#define FREELIST_LEDGER_INVALID_BLOCK
Definition freelist.h:6
u32 freelist_ledger_ptr_t
Definition freelist.h:8
#define list_get_ty_ptr(ty, ls, idx)
Definition list.h:128
#define list_init_ty(ty, ls, alloc)
Definition list.h:36
static void list_cleanup(list_t *ls)
Definition list.h:166
#define list_push_var(ls, var)
Definition list.h:83
static void list_insert(list_t *ls, sz idx, const void *data)
Definition list.h:90
A generic allocator type passed by value. Contains a fallback allocator and a set of function pointer...
Definition memory.h:30
An object that implements malloc-like behaviour without specifying the exact internal object being ma...
Definition freelist.h:22
u32 capacity
The maximum amount of slots managed by the ledger. Errors out if reached.
Definition freelist.h:28
static void freelist_ledger_release(freelist_ledger_t *ledger, freelist_ledger_ptr_t at)
Returns the block back into the pool.
Definition freelist.h:72
list_t _blocks
The blocks that were reserved. Contrary to the name, this list stores the busy blocks,...
Definition freelist.h:25
static void freelist_ledger_init(freelist_ledger_t *ledger, allocator_t allocator, u32 capacity)
Definition freelist.h:32
static freelist_ledger_ptr_t freelist_ledger_reserve(freelist_ledger_t *ledger, u32 size)
Reserves the next block from the ledger. Returns FREELIST_LEDGER_INVALID_BLOCK if the requested block...
Definition freelist.h:41
static void freelist_ledger_cleanup(freelist_ledger_t *ledger)
Definition freelist.h:90
Definition list.h:13
sz size
Definition list.h:17