Add arena allocator library
All checks were successful
Build documentation / build-and-deploy (push) Successful in 2m44s
All checks were successful
Build documentation / build-and-deploy (push) Successful in 2m44s
This commit is contained in:
1
Makefile
1
Makefile
@@ -10,3 +10,4 @@ include make/libprocess.mk
|
|||||||
include make/libstring.mk
|
include make/libstring.mk
|
||||||
include make/libkb.mk
|
include make/libkb.mk
|
||||||
include make/libaux.mk
|
include make/libaux.mk
|
||||||
|
include make/libarena.mk
|
||||||
|
|||||||
@@ -10,3 +10,4 @@ make -B all_compiledb_libterminal
|
|||||||
make -B all_compiledb_libstring
|
make -B all_compiledb_libstring
|
||||||
make -B all_compiledb_libkb
|
make -B all_compiledb_libkb
|
||||||
make -B all_compiledb_libaux
|
make -B all_compiledb_libaux
|
||||||
|
make -B all_compiledb_libarena
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ make -B all_libterminal
|
|||||||
make -B all_libstring
|
make -B all_libstring
|
||||||
make -B all_libkb
|
make -B all_libkb
|
||||||
make -B all_libaux
|
make -B all_libaux
|
||||||
|
make -B all_libarena
|
||||||
make -B all_apps
|
make -B all_apps
|
||||||
make -B all_dist
|
make -B all_dist
|
||||||
./aux/limine_iso_amd64.sh
|
./aux/limine_iso_amd64.sh
|
||||||
|
|||||||
@@ -11,5 +11,6 @@ make -B docs_libstring
|
|||||||
make -B docs_libterminal
|
make -B docs_libterminal
|
||||||
make -B docs_libkb
|
make -B docs_libkb
|
||||||
make -B docs_libaux
|
make -B docs_libaux
|
||||||
|
make -B docs_libarena
|
||||||
|
|
||||||
mkdocs build
|
mkdocs build
|
||||||
|
|||||||
@@ -10,4 +10,5 @@ make -B format_liballoc
|
|||||||
make -B format_libstring
|
make -B format_libstring
|
||||||
make -B format_libkb
|
make -B format_libkb
|
||||||
make -B format_libaux
|
make -B format_libaux
|
||||||
|
make -B format_libarena
|
||||||
make -B format_apps
|
make -B format_apps
|
||||||
|
|||||||
4
libarena/.gitignore
vendored
Normal file
4
libarena/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
*.o
|
||||||
|
*.json
|
||||||
|
docs/
|
||||||
|
.cache/
|
||||||
7
libarena/Makefile
Normal file
7
libarena/Makefile
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
include ../make/ufuncs.mk
|
||||||
|
|
||||||
|
$(eval $(call add_include,liballoc))
|
||||||
|
|
||||||
|
libname := libarena
|
||||||
|
|
||||||
|
include ../make/lib.mk
|
||||||
78
libarena/arena.c
Normal file
78
libarena/arena.c
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
#include <arena.h>
|
||||||
|
#include <liballoc.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
static struct arena_chunk* arena_create_chunk (size_t capacity) {
|
||||||
|
size_t size = sizeof (struct arena_chunk) + sizeof (uintptr_t) * capacity;
|
||||||
|
struct arena_chunk* chunk = malloc (size);
|
||||||
|
|
||||||
|
if (chunk == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
chunk->next = NULL;
|
||||||
|
chunk->size = 0;
|
||||||
|
chunk->capacity = capacity;
|
||||||
|
return chunk;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void arena_destroy_chunk (struct arena_chunk* chunk) { free (chunk); }
|
||||||
|
|
||||||
|
void arena_reset (struct arena* arena) {
|
||||||
|
for (struct arena_chunk* chunk = arena->begin; chunk != NULL; chunk = chunk->next) {
|
||||||
|
chunk->size = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
arena->end = arena->begin;
|
||||||
|
}
|
||||||
|
|
||||||
|
void arena_destroy (struct arena* arena) {
|
||||||
|
struct arena_chunk* chunk = arena->begin;
|
||||||
|
|
||||||
|
while (chunk) {
|
||||||
|
struct arena_chunk* chunk1 = chunk;
|
||||||
|
chunk = chunk->next;
|
||||||
|
arena_destroy_chunk (chunk1);
|
||||||
|
}
|
||||||
|
|
||||||
|
arena->begin = NULL;
|
||||||
|
arena->end = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* arena_malloc (struct arena* arena, size_t size) {
|
||||||
|
size_t size1 = (size + sizeof (uintptr_t) - 1) / sizeof (uintptr_t);
|
||||||
|
|
||||||
|
if (arena->end == NULL) {
|
||||||
|
size_t capacity = ARENA_CHUNK_CAPACITY;
|
||||||
|
|
||||||
|
if (capacity < size1) {
|
||||||
|
capacity = size1;
|
||||||
|
}
|
||||||
|
|
||||||
|
arena->end = arena_create_chunk (capacity);
|
||||||
|
|
||||||
|
if (arena->end == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
arena->begin = arena->end;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (arena->end->size + size1 > arena->end->capacity && arena->end->next != NULL) {
|
||||||
|
arena->end = arena->end->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (arena->end->size + size1 > arena->end->capacity) {
|
||||||
|
size_t capacity = ARENA_CHUNK_CAPACITY;
|
||||||
|
|
||||||
|
if (capacity < size1) {
|
||||||
|
capacity = size1;
|
||||||
|
}
|
||||||
|
|
||||||
|
arena->end = arena_create_chunk (capacity);
|
||||||
|
arena->end = arena->end->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* result = &arena->end->memory[arena->end->size];
|
||||||
|
arena->end->size += size1;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
25
libarena/arena.h
Normal file
25
libarena/arena.h
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
#ifndef _LIBARENA_ARENA_H
|
||||||
|
#define _LIBARENA_ARENA_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#define ARENA_CHUNK_CAPACITY (8 * 1024)
|
||||||
|
|
||||||
|
struct arena_chunk {
|
||||||
|
struct arena_chunk* next;
|
||||||
|
size_t capacity;
|
||||||
|
size_t size;
|
||||||
|
uintptr_t memory[];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct arena {
|
||||||
|
struct arena_chunk *begin, *end;
|
||||||
|
};
|
||||||
|
|
||||||
|
void arena_reset (struct arena* arena);
|
||||||
|
|
||||||
|
void arena_destroy (struct arena* arena);
|
||||||
|
|
||||||
|
void* arena_malloc (struct arena* arena, size_t size);
|
||||||
|
|
||||||
|
#endif // _LIBARENA_ARENA_H
|
||||||
3
libarena/src.mk
Normal file
3
libarena/src.mk
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
c += arena.c
|
||||||
|
|
||||||
|
o += arena.o
|
||||||
16
make/libarena.mk
Normal file
16
make/libarena.mk
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
all_libarena:
|
||||||
|
make -C libarena platform=$(platform) all
|
||||||
|
|
||||||
|
all_compiledb_libarena:
|
||||||
|
bear --output libarena/compile_commands.json -- make -C libarena platform=$(platform) all
|
||||||
|
|
||||||
|
clean_libarena:
|
||||||
|
make -C libarena platform=$(platform) clean
|
||||||
|
|
||||||
|
format_libarena:
|
||||||
|
make -C libarena platform=$(platform) format
|
||||||
|
|
||||||
|
docs_libarena:
|
||||||
|
make -C libarena platform=$(platform) docs
|
||||||
|
|
||||||
|
.PHONY: all_libarena clean_libarena format_libarena docs_libarena all_compiledb_libarena
|
||||||
Reference in New Issue
Block a user