99 lines
2.2 KiB
Markdown
99 lines
2.2 KiB
Markdown
|
# memory
|
||
|
|
||
|
Custom allocators and memory functions
|
||
|
|
||
|
# Arena Allocator
|
||
|
|
||
|
A simple arena-style allocator
|
||
|
|
||
|
## Structs
|
||
|
|
||
|
### ArenaAllocator
|
||
|
|
||
|
Represents an arena allocator. `ArenaAllocator` holds its own buffer, but managing its size is left to the user. Like
|
||
|
most structs in `libflint`, it must be malloced first before being passed to `arena_init()`.
|
||
|
|
||
|
```c
|
||
|
typedef struct {
|
||
|
unsigned char* buf;
|
||
|
size_t buf_sz;
|
||
|
size_t offset_cur;
|
||
|
size_t offset_prev;
|
||
|
} ArenaAllocator;
|
||
|
```
|
||
|
|
||
|
## Functions
|
||
|
|
||
|
### arena_init
|
||
|
|
||
|
Initializes the `ArenaAllocator`. The struct must first be created by the user using `malloc()`, see the example below.
|
||
|
`buf_sz` is the size of the underlying buffer in bytes.
|
||
|
|
||
|
```c
|
||
|
void arena_init(ArenaAllocator *allocator, size_t buf_sz);
|
||
|
|
||
|
/* Usage */
|
||
|
ArenaAllocator *a = malloc(sizeof(ArenaAllocator));
|
||
|
arena_init(a, 1024);
|
||
|
```
|
||
|
|
||
|
### arena_free
|
||
|
Frees `allocator` and its underlying buffer. Users should set `allocator` to `NULL` after calling `arena_free()`.
|
||
|
```c
|
||
|
void arena_free(ArenaAllocator *allocator);
|
||
|
|
||
|
/* Usage */
|
||
|
arena_free(allocator);
|
||
|
allocator = NULL;
|
||
|
```
|
||
|
|
||
|
### arena_clear
|
||
|
|
||
|
Resets the offset markers of the arena to `0`, but does not wipe the underlying buffer. Technically, any assigned pointers
|
||
|
will still work and
|
||
|
|
||
|
```c
|
||
|
void arena_clear(ArenaAllocator *allocator);
|
||
|
```
|
||
|
|
||
|
|
||
|
### *arena_malloc
|
||
|
|
||
|
Request memory of `size` bytes in length from the arena. Returns `NULL` if the assignment failed.
|
||
|
|
||
|
```c
|
||
|
void *arena_malloc(ArenaAllocator* allocator, size_t size);
|
||
|
```
|
||
|
|
||
|
### arena_resize_buf
|
||
|
|
||
|
Reallocates the underlying buffer in the arena to `new_sz`. You can grow or shrink the arena using this function. Any
|
||
|
pointers allocated out of the arena are invalid after using this function.
|
||
|
|
||
|
```c
|
||
|
void arena_resize_buf(ArenaAllocator *allocator, size_t new_sz);
|
||
|
```
|
||
|
|
||
|
### *arena_resize
|
||
|
|
||
|
Resize an allocated pointer from the arena. See the example below for a simple use case
|
||
|
|
||
|
```c
|
||
|
void *arena_resize(ArenaAllocator *allocator, void *mem, size_t old_sz, size_t new_sz);
|
||
|
|
||
|
/* Usage */
|
||
|
int *i = arena_malloc(a, sizeof(int));
|
||
|
*i = 1;
|
||
|
long *l = arena_resize(a, i1, sizeof(int), sizeof(long));
|
||
|
assert(*l == 1);
|
||
|
```
|
||
|
|
||
|
## Macros
|
||
|
|
||
|
### arena_sz
|
||
|
|
||
|
Convenience macro for getting the size of the arena's buffer
|
||
|
|
||
|
```c
|
||
|
#define arena_sz(a) (a)->buf_sz
|
||
|
```
|