Compare commits

..

No commits in common. "19e27ca78233b752759b7b8365e31982937db615" and "90ff13c07a3259d423be832c7b62439a44b47b9a" have entirely different histories.

3 changed files with 21 additions and 43 deletions

View file

@ -2,7 +2,6 @@
#include <assert.h> #include <assert.h>
#include <stddef.h> #include <stddef.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#define DEFAUL_REGION_SIZE 1048576 /* 8 * 1024 * 1024 = 8MB */ #define DEFAUL_REGION_SIZE 1048576 /* 8 * 1024 * 1024 = 8MB */
@ -13,44 +12,33 @@ Region *new_region(size_t capacity) {
Region *region = malloc(capacity + sizeof(Region)); Region *region = malloc(capacity + sizeof(Region));
assert(region != NULL); assert(region != NULL);
*region = (Region){.next = NULL, .capacity = capacity, .cursor = 0}; *region = (Region){.next = NULL, .capacity = capacity, .cursor = 0};
// Zero initialise memory
memset(region->data, 0, capacity);
return region; return region;
} }
Arena *arena_init(Arena *parent, size_t capacity) { Arena arena_init(Arena *parent, size_t capacity) {
Region *region = new_region(capacity); Region *region = new_region(capacity);
if (parent != NULL) { if (parent != NULL) {
// Allocate new arena in parent to reduce likelyhood of loss // Allocate new arena in parent to reduce likelyhood of loss
Arena *current_arena = arena_alloc(parent, sizeof(Arena)); Arena *current_arena = arena_alloc(parent, sizeof(Arena));
*current_arena = (Arena){.is_root = false, *current_arena = (Arena){
.begin = region, .begin = region, .end = region, .child = NULL, .sibling = NULL};
.end = region,
.child = NULL,
.sibling = NULL};
// if parent has no children this arena is now it's child // if parent has no children this arena is now it's child
if (parent->child == NULL) { if (parent->child == NULL) {
parent->child = current_arena; parent->child = current_arena;
return current_arena; return *current_arena;
} }
// Push the arena onto the first childs sibling list // Push the arena onto the first childs sibling list
current_arena->sibling = parent->child; current_arena->sibling = parent->child;
parent->child = current_arena; parent->child = current_arena;
return current_arena; return *current_arena;
} }
// Create root of arena tree // This is the root of the arena tree
Arena *arena = malloc(sizeof(Arena)); Arena arena = {
*arena = (Arena){.is_root = true, .begin = region, .end = region, .child = NULL, .sibling = NULL};
.begin = region,
.end = region,
.child = NULL,
.sibling = NULL};
return arena; return arena;
} }
@ -74,16 +62,10 @@ void arena_deinit(Arena *arena) {
region = next_region; region = next_region;
} }
arena->begin = NULL; *arena = (Arena){.begin = NULL, .end = NULL};
arena->end = NULL;
if (arena->is_root) {
free(arena);
}
} }
void *arena_alloc(Arena *arena, size_t size) { 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; Region *region = arena->end;
assert(region != NULL); assert(region != NULL);
@ -95,8 +77,6 @@ void *arena_alloc(Arena *arena, size_t size) {
void *result = &region->data[region->cursor]; void *result = &region->data[region->cursor];
region->cursor += size; region->cursor += size;
// TODO: only align when needed
size = (size + 7) & ~7; // align size increase to multiple of 8
return result; return result;
} }

View file

@ -1,6 +1,5 @@
#pragma once #pragma once
#include <stdbool.h>
#include <stddef.h> #include <stddef.h>
typedef struct Region_s Region; typedef struct Region_s Region;
@ -13,14 +12,13 @@ struct Region_s {
typedef struct Arena_s Arena; typedef struct Arena_s Arena;
struct Arena_s { struct Arena_s {
bool is_root;
Arena *child; Arena *child;
Arena *sibling; Arena *sibling;
Region *begin; Region *begin;
Region *end; Region *end;
}; };
Arena *arena_init(Arena *parent, size_t capacity); Arena arena_init(Arena *parent, size_t capacity);
void arena_deinit(Arena *arena); void arena_deinit(Arena *arena);
void *arena_alloc(Arena *arena, size_t size); void *arena_alloc(Arena *arena, size_t size);

View file

@ -13,23 +13,23 @@
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
// arena allocation test // arena allocation test
printf("Allocation test\n"); printf("Allocation test");
Arena *global_arena = arena_init(NULL, 0); Arena global_arena = arena_init(NULL, 0);
for (int i = 0; i <= 1048576 + 100; i++) { 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; *number = 42;
} }
printf("children test");
// arena children test // arena children test
printf("children test\n"); Arena child_arena = arena_init(&global_arena, 0);
Arena *child_arena = arena_init(global_arena, 0); //Arena sibling_arena = arena_init(&global_arena, 0);
Arena *sibling_arena = arena_init(global_arena, 0); //Arena grandchild_arena = arena_init(&child_arena, 0);
Arena *grandchild_arena = arena_init(child_arena, 0);
printf("deinit test\n"); arena_deinit(&global_arena);
arena_deinit(global_arena);
printf("tests complete\n");
} }
/*int main(int argc, char *argv[]) { /*int main(int argc, char *argv[]) {