Working on simplifying the allocation scheme

This commit is contained in:
Krzosa Karol
2023-01-01 10:48:06 +01:00
parent d10b72057e
commit 8c0a8bf72b
9 changed files with 126 additions and 98 deletions

View File

@@ -415,7 +415,7 @@ operator!=(Intern_String a, Intern_String b){
#define allocate_array(a, T, size,...) (T *)allocate_size(a, sizeof(T)*(size),##__VA_ARGS__)
#define allocate_struct(a, T, ...) allocate_array(a, T, 1,##__VA_ARGS__)
CORE_Static void *allocate_size(Allocator *allocator, size_t size, bool zero_memory = true) {
void *result = allocator->allocate(allocator, size);
void *result = allocator->allocate(allocator, size);
if (zero_memory) {
memory_zero(result, size);
}
@@ -517,6 +517,17 @@ arena_init(Arena *a, String debug_name){
a->deallocate = (Allocator::Deallocate *)deallocate_stub;
}
CORE_Static Arena
arena_sub(Arena *base, size_t size, String debug_name) {
Arena result = {};
result.memory.data = (U8 *)arena_push_size(base, size);
result.memory.commit = size;
result.memory.reserve = size;
result.alignment = default_alignment;
result.len = 0;
return result;
}
enum Log_Kind{Log_Kind_Normal_No_NewLine, Log_Kind_Normal, Log_Kind_Error, Log_Kind_Trace};
typedef void Log_Proc(Log_Kind kind, String string, char *file, int line);
//-----------------------------------------------------------------------------
@@ -652,7 +663,7 @@ struct Array{
cap = size;
}
Array<T> copy(Arena *a){
Array<T> copy(Allocator *a){
Array<T> result = {};
result.len = len;
result.cap = len*2;
@@ -662,7 +673,7 @@ struct Array{
return result;
}
Array<T> tight_copy(Arena *a){
Array<T> tight_copy(Allocator *a){
Array<T> result = {};
result.len = len;
result.cap = len;
@@ -952,17 +963,6 @@ test_intern_table(){
assert(intern3.str != intern2.str);
}
CORE_Static Arena
arena_sub(Arena *base, size_t size, String debug_name) {
Arena result = {};
result.memory.data = (U8 *)arena_push_size(base, size);
result.memory.commit = size;
result.memory.reserve = size;
result.alignment = default_alignment;
result.len = 0;
return result;
}
//-----------------------------------------------------------------------------
// Array List
// @todo(krzosa): If even one item got removed from block
@@ -990,21 +990,23 @@ struct List{
};
template<class T>
List_Node<T> *list_allocate_node(Arena *arena, int size){
auto node = (List_Node<T> *)arena_push_size(arena, sizeof(List_Node<T>) + size*sizeof(T));
List_Node<T> *list_allocate_node(Allocator *arena, int size){
auto node = (List_Node<T> *)allocate_size(arena, sizeof(List_Node<T>) + size*sizeof(T), false);
node->cap = size;
node->len = 0;
node->next = 0;
node->prev = 0;
return node;
}
template<class T>
void list_allocate_free_node(Arena *arena, List<T> *list, int size){
void list_allocate_free_node(Allocator *arena, List<T> *list, int size){
List_Node<T> *node = list_allocate_node<T>(arena, size);
DLL_STACK_ADD(list->first_free, node);
}
template<class T>
void list_make_sure_there_is_room_for_item_count(Arena *arena, List<T> *list, int item_count){
void list_make_sure_there_is_room_for_item_count(Allocator *arena, List<T> *list, int item_count){
if(list->last == 0 || list->last->len + item_count > list->last->cap){
// Not enough space we need to get a new block
List_Node<T> *node = 0;
@@ -1064,13 +1066,13 @@ T get(List<T> *list, int index){
}
template<class T>
void add(Arena *arena, List<T> *list, T item){
void add(Allocator *arena, List<T> *list, T item){
list_make_sure_there_is_room_for_item_count(arena, list, 1);
list->last->data[list->last->len++] = item;
}
template<class T>
T *add_size(Arena *arena, List<T> *list, int count = 1, int zero_memory = 0){
T *add_size(Allocator *arena, List<T> *list, int count = 1, int zero_memory = 0){
list_make_sure_there_is_room_for_item_count(arena, list, count);
T *result = list->last->data + list->last->len;
list->last->len += count;
@@ -1183,9 +1185,9 @@ T pop(List<T> *list){
}
template<class T>
T *merge(Arena *arena, List<T> *list){
T *merge(Allocator *arena, List<T> *list){
int len = length(list);
T *result = arena_push_array(arena, T, len);
T *result = allocate_size(arena, T, len, false);
int i = 0;
For_Linked_List(list->first){