refactor-xmake #2
@@ -30,6 +30,15 @@ typedef struct {
|
|||||||
};
|
};
|
||||||
} ArenaPointer;
|
} ArenaPointer;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
bool is_valid;
|
||||||
|
|
||||||
|
union {
|
||||||
|
ArenaErr err;
|
||||||
|
Allocator allocator;
|
||||||
|
};
|
||||||
|
} ArenaAllocResult;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool is_valid;
|
bool is_valid;
|
||||||
union {
|
union {
|
||||||
@@ -54,4 +63,6 @@ ArenaSizeResult arena_get_align_padding(Arena *arena, size_t alignment);
|
|||||||
// I shouldn't cover.
|
// I shouldn't cover.
|
||||||
ArenaErr arena_ensure_capacity(Arena *arena, size_t size, size_t alignment);
|
ArenaErr arena_ensure_capacity(Arena *arena, size_t size, size_t alignment);
|
||||||
|
|
||||||
|
ArenaAllocResult arena_get_allocator(Arena *arena);
|
||||||
|
|
||||||
#endif // !RENA_H
|
#endif // !RENA_H
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#include "lae_arena.h"
|
#include "lae_arena.h"
|
||||||
#include "lae_allocator.h"
|
#include "lae_allocator.h"
|
||||||
|
#include <stdalign.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@@ -14,6 +15,16 @@ struct Arena {
|
|||||||
Allocator allocator;
|
Allocator allocator;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void *arena_allocator_alloc(void *ctx, size_t size, size_t alignment);
|
||||||
|
static void *arena_allocator_realloc(
|
||||||
|
void *ctx,
|
||||||
|
void *pointer,
|
||||||
|
size_t old_size,
|
||||||
|
size_t new_size,
|
||||||
|
size_t alignment);
|
||||||
|
static void
|
||||||
|
arena_allocator_free(void *ctx, void *pointer, size_t size, size_t alignment);
|
||||||
|
|
||||||
ArenaErr arena_init(Arena **arena, Allocator allocator, size_t capacity) {
|
ArenaErr arena_init(Arena **arena, Allocator allocator, size_t capacity) {
|
||||||
if (arena == NULL) {
|
if (arena == NULL) {
|
||||||
return ARENA_NULL_ARG;
|
return ARENA_NULL_ARG;
|
||||||
@@ -23,14 +34,15 @@ ArenaErr arena_init(Arena **arena, Allocator allocator, size_t capacity) {
|
|||||||
return ARENA_INVALID_SIZE;
|
return ARENA_INVALID_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Arena *new_arena = allocator.alloc(allocator.ctx, sizeof(Arena));
|
Arena *new_arena =
|
||||||
|
allocator.alloc(allocator.ctx, sizeof(Arena), alignof(Arena));
|
||||||
if (new_arena == NULL) {
|
if (new_arena == NULL) {
|
||||||
return ARENA_BAD_ALLOC;
|
return ARENA_BAD_ALLOC;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *buffer = allocator.alloc(allocator.ctx, capacity);
|
void *buffer = allocator.alloc(allocator.ctx, capacity, 0);
|
||||||
if (buffer == NULL) {
|
if (buffer == NULL) {
|
||||||
allocator.free(allocator.ctx, new_arena, capacity);
|
allocator.free(allocator.ctx, new_arena, capacity, 0);
|
||||||
return ARENA_BAD_ALLOC;
|
return ARENA_BAD_ALLOC;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,11 +64,12 @@ ArenaErr arena_destroy(Arena **arena) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Arena *tmp = *arena;
|
Arena *tmp = *arena;
|
||||||
tmp->allocator.free(tmp->allocator.ctx, tmp->buffer, tmp->capacity);
|
tmp->allocator.free(tmp->allocator.ctx, tmp->buffer, tmp->capacity, 0);
|
||||||
tmp->buffer = NULL;
|
tmp->buffer = NULL;
|
||||||
tmp->offset = 0;
|
tmp->offset = 0;
|
||||||
tmp->capacity = 0;
|
tmp->capacity = 0;
|
||||||
tmp->allocator.free(tmp->allocator.ctx, *arena, sizeof(Arena));
|
tmp->allocator
|
||||||
|
.free(tmp->allocator.ctx, *arena, sizeof(Arena), alignof(Arena));
|
||||||
*arena = NULL;
|
*arena = NULL;
|
||||||
|
|
||||||
return ARENA_OK;
|
return ARENA_OK;
|
||||||
@@ -200,7 +213,8 @@ ArenaErr arena_resize(Arena *arena, size_t new_capacity) {
|
|||||||
arena->allocator.ctx,
|
arena->allocator.ctx,
|
||||||
arena->buffer,
|
arena->buffer,
|
||||||
arena->capacity,
|
arena->capacity,
|
||||||
new_capacity);
|
new_capacity,
|
||||||
|
0);
|
||||||
if (tmp == NULL) {
|
if (tmp == NULL) {
|
||||||
return ARENA_BAD_ALLOC;
|
return ARENA_BAD_ALLOC;
|
||||||
}
|
}
|
||||||
@@ -233,3 +247,40 @@ void *arena_unwrap_pointer(ArenaPointer p) {
|
|||||||
}
|
}
|
||||||
return p.arena->buffer + p.offset;
|
return p.arena->buffer + p.offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void *arena_allocator_alloc(void *ctx, size_t size, size_t alignment) {
|
||||||
|
Arena *arena = ctx;
|
||||||
|
|
||||||
|
return arena_unwrap_pointer(arena_alloc(arena, size, alignment));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *arena_allocator_realloc(
|
||||||
|
void *ctx,
|
||||||
|
void *pointer,
|
||||||
|
size_t old_size,
|
||||||
|
size_t new_size,
|
||||||
|
size_t alignment) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
arena_allocator_free(void *ctx, void *pointer, size_t size, size_t alignment) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ArenaAllocResult arena_get_allocator(Arena *arena) {
|
||||||
|
if (arena == NULL) {
|
||||||
|
return (ArenaAllocResult){
|
||||||
|
.is_valid = false,
|
||||||
|
.err = ARENA_NULL_ARG,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Allocator allocator = {
|
||||||
|
.alloc = arena_allocator_alloc,
|
||||||
|
.realloc = arena_allocator_realloc,
|
||||||
|
.free = arena_allocator_free,
|
||||||
|
.ctx = arena};
|
||||||
|
|
||||||
|
return (ArenaAllocResult){.is_valid = true, .allocator = allocator};
|
||||||
|
}
|
||||||
|
|||||||
@@ -78,12 +78,12 @@ if has_config("tests") then
|
|||||||
target("test_arena")
|
target("test_arena")
|
||||||
set_kind("binary")
|
set_kind("binary")
|
||||||
|
|
||||||
|
add_files("test/test_arena.c")
|
||||||
|
|
||||||
add_deps("lae_arena")
|
add_deps("lae_arena")
|
||||||
|
|
||||||
add_packages("cmocka")
|
add_packages("cmocka")
|
||||||
|
|
||||||
add_files("test/test_arena.c")
|
|
||||||
|
|
||||||
add_tests("default")
|
add_tests("default")
|
||||||
|
|
||||||
if has_config("asan") then
|
if has_config("asan") then
|
||||||
|
|||||||
Reference in New Issue
Block a user