Compare commits
No commits in common. "11b7d95fcad712134ff695bb0eabb03b9261f810" and "b99b8ed7517fd92b47288538b0ada2699a9955e7" have entirely different histories.
11b7d95fca
...
b99b8ed751
3 changed files with 17 additions and 111 deletions
|
|
@ -2,7 +2,6 @@
|
|||
#include <assert.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define DEFAUL_REGION_SIZE 1048576 /* 8 * 1024 * 1024 = 8MB */
|
||||
|
||||
|
|
@ -12,60 +11,19 @@ Region *new_region(size_t capacity) {
|
|||
}
|
||||
Region *region = malloc(capacity + sizeof(Region));
|
||||
assert(region != NULL);
|
||||
*region = (Region){.next = NULL, .capacity = capacity, .cursor = 0};
|
||||
|
||||
// Zero initialise memory
|
||||
memset(region->data, 0, capacity);
|
||||
|
||||
*region = (Region){.next = NULL,
|
||||
.capacity = capacity,
|
||||
.cursor = 0};
|
||||
return region;
|
||||
}
|
||||
|
||||
Arena *arena_init(Arena *parent, size_t capacity) {
|
||||
Arena arena_init(size_t capacity) {
|
||||
Region *region = new_region(capacity);
|
||||
|
||||
if (parent != NULL) {
|
||||
// Allocate new arena in parent to reduce likelyhood of loss
|
||||
Arena *current_arena = arena_alloc(parent, sizeof(Arena));
|
||||
*current_arena = (Arena){.parent = parent,
|
||||
.begin = region,
|
||||
.end = region,
|
||||
.child = NULL,
|
||||
.sibling = NULL};
|
||||
|
||||
// if parent has no children this arena is now it's child
|
||||
if (parent->child == NULL) {
|
||||
parent->child = current_arena;
|
||||
return current_arena;
|
||||
}
|
||||
|
||||
// Push the arena onto the first childs sibling list
|
||||
current_arena->sibling = parent->child;
|
||||
parent->child = current_arena;
|
||||
return current_arena;
|
||||
}
|
||||
|
||||
// Create root of arena tree
|
||||
Arena *arena = malloc(sizeof(Arena));
|
||||
*arena = (Arena){.parent = NULL,
|
||||
.begin = region,
|
||||
.end = region,
|
||||
.child = NULL,
|
||||
.sibling = NULL};
|
||||
Arena arena = {.begin = region, .end = region};
|
||||
return arena;
|
||||
}
|
||||
|
||||
void arena_deinit(Arena *arena) {
|
||||
if (arena == NULL) {
|
||||
return;
|
||||
}
|
||||
// Recursively deinit children
|
||||
while (arena->child != NULL) {
|
||||
Arena *current_child = arena->child;
|
||||
arena->child = current_child->sibling;
|
||||
arena_deinit(current_child);
|
||||
}
|
||||
|
||||
// actually free the data
|
||||
assert(arena->begin != NULL && arena->end != NULL);
|
||||
Region *region = arena->begin;
|
||||
while (region != NULL) {
|
||||
|
|
@ -73,34 +31,10 @@ void arena_deinit(Arena *arena) {
|
|||
free(region);
|
||||
region = next_region;
|
||||
}
|
||||
|
||||
arena->begin = NULL;
|
||||
arena->end = NULL;
|
||||
|
||||
// If we're the tree root free us from malloc
|
||||
if (arena->parent == NULL) {
|
||||
free(arena);
|
||||
return;
|
||||
}
|
||||
|
||||
// Now that we have no descendants tell our parent and siblings of our death
|
||||
if (arena->parent->child == arena) {
|
||||
arena->parent->child = arena->sibling;
|
||||
return;
|
||||
}
|
||||
|
||||
Arena *previous_sibling = arena->parent->child;
|
||||
while (previous_sibling != NULL && previous_sibling->sibling != arena) {
|
||||
previous_sibling = previous_sibling->sibling;
|
||||
}
|
||||
if (previous_sibling != NULL) {
|
||||
previous_sibling->sibling = arena->sibling;
|
||||
}
|
||||
*arena = (Arena){.begin = NULL, .end = NULL};
|
||||
}
|
||||
|
||||
void *arena_alloc(Arena *arena, size_t size) {
|
||||
// TODO: only align when needed
|
||||
size = (size + 7) & ~7; // align size increase to multiple of 8
|
||||
Region *region = arena->end;
|
||||
assert(region != NULL);
|
||||
|
||||
|
|
@ -112,8 +46,6 @@ void *arena_alloc(Arena *arena, size_t size) {
|
|||
|
||||
void *result = ®ion->data[region->cursor];
|
||||
region->cursor += size;
|
||||
// TODO: only align when needed
|
||||
size = (size + 7) & ~7; // align size increase to multiple of 8
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
typedef struct Region_s Region;
|
||||
struct Region_s {
|
||||
|
|
@ -10,16 +11,12 @@ struct Region_s {
|
|||
unsigned char data[];
|
||||
};
|
||||
|
||||
typedef struct Arena_s Arena;
|
||||
struct Arena_s {
|
||||
Arena *parent;
|
||||
Arena *child;
|
||||
Arena *sibling;
|
||||
typedef struct {
|
||||
Region *begin;
|
||||
Region *end;
|
||||
};
|
||||
} Arena;
|
||||
|
||||
Arena *arena_init(Arena *parent, size_t capacity);
|
||||
Arena arena_init(size_t capacity);
|
||||
void arena_deinit(Arena *arena);
|
||||
|
||||
void *arena_alloc(Arena *arena, size_t size);
|
||||
|
|
|
|||
33
src/main.c
33
src/main.c
|
|
@ -10,37 +10,14 @@
|
|||
|
||||
#include "arena_allocator.h"
|
||||
|
||||
/*
|
||||
int main(int argc, char *argv[]) {
|
||||
// arena allocation test
|
||||
printf("Allocation test\n");
|
||||
Arena *global_arena = arena_init(NULL, 0);
|
||||
/*int main(int argc, char *argv[]) {
|
||||
Arena global_arena = arena_init(0);
|
||||
for (int i = 0; i <= 1048576+100; i++) {
|
||||
int *number = arena_alloc(global_arena, sizeof(int));
|
||||
int *number = arena_alloc(&global_arena, sizeof(int));
|
||||
*number = 42;
|
||||
}
|
||||
|
||||
// arena children test
|
||||
printf("children test\n");
|
||||
Arena *child_arena = arena_init(global_arena, 0);
|
||||
Arena *sibling_arena = arena_init(global_arena, 0);
|
||||
Arena *grandchild_arena = arena_init(child_arena, 0);
|
||||
Arena *greatgrandchild_arena = arena_init(grandchild_arena, 0);
|
||||
Arena *greatgrandchildsibling_arena = arena_init(grandchild_arena, 0);
|
||||
Arena *greatgrandchildsiblingsibling_arena = arena_init(grandchild_arena, 0);
|
||||
Arena *greategreatgrandchild_arena =
|
||||
arena_init(greatgrandchildsibling_arena, 0);
|
||||
Arena *greatsiblinggreatgrandchild_arena =
|
||||
arena_init(greatgrandchildsiblingsibling_arena, 0);
|
||||
|
||||
printf("deinit tests\n");
|
||||
arena_deinit(greatgrandchild_arena);
|
||||
|
||||
arena_deinit(global_arena);
|
||||
|
||||
printf("tests complete\n");
|
||||
}
|
||||
*/
|
||||
arena_deinit(&global_arena);
|
||||
}*/
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
wn_window window = {0};
|
||||
|
|
|
|||
Loading…
Reference in a new issue