mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-14 17:28:07 +00:00
arena helper for dealing with buffer preallocation for workers
This commit is contained in:
@@ -25,16 +25,35 @@ push_array_copy_u64(Arena *arena, U64 *v, U64 count)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal U64 **
|
internal Arena **
|
||||||
push_matrix_u64(Arena *arena, U64 rows, U64 columns)
|
alloc_arena_many(Arena *arena, U64 count, U64 *sizes)
|
||||||
{
|
{
|
||||||
U64 **result = push_array_no_zero(arena, U64 *, rows);
|
Arena **result = push_array(arena, Arena *, count);
|
||||||
for (U64 row_idx = 0; row_idx < rows; row_idx += 1) {
|
U64 total_size = sum_array_u64(count, sizes);
|
||||||
result[row_idx] = push_array(arena, U64, columns);
|
U8 *buffer = push_array(arena, U8, total_size + (ARENA_HEADER_SIZE * count));
|
||||||
|
U64 offset = 0;
|
||||||
|
for EachIndex(i, count) {
|
||||||
|
if (sizes[i] > 0) {
|
||||||
|
void *backing_buffer = buffer + offset;
|
||||||
|
result[i] = arena_alloc_(&(ArenaParams){ .flags = ArenaFlag_NoChain, .optional_backing_buffer = backing_buffer, .reserve_size = ARENA_HEADER_SIZE + sizes[i], .commit_size = ARENA_HEADER_SIZE + sizes[i] });
|
||||||
|
offset += ARENA_HEADER_SIZE;
|
||||||
|
offset += sizes[i];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal Arena **
|
||||||
|
alloc_arena_array_(Arena *arena, U64 count, U64 *counts, U64 element_size)
|
||||||
|
{
|
||||||
|
Temp scratch = scratch_begin(&arena, 1);
|
||||||
|
U64 *sizes = push_array(scratch.arena, U64, count);
|
||||||
|
for EachIndex(i, count) { sizes[i] = counts[i] * element_size; }
|
||||||
|
Arena **result = alloc_arena_many(arena, count, sizes);
|
||||||
|
scratch_end(scratch);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
internal Arena **
|
internal Arena **
|
||||||
alloc_fixed_size_arena_array(Arena *arena, U64 count, U64 res, U64 cmt)
|
alloc_fixed_size_arena_array(Arena *arena, U64 count, U64 res, U64 cmt)
|
||||||
{
|
{
|
||||||
@@ -44,26 +63,11 @@ alloc_fixed_size_arena_array(Arena *arena, U64 count, U64 res, U64 cmt)
|
|||||||
Arena **arr = (Arena **)(count_ptr + 1);
|
Arena **arr = (Arena **)(count_ptr + 1);
|
||||||
*count_ptr = count;
|
*count_ptr = count;
|
||||||
|
|
||||||
ArenaParams params = {0};
|
for EachIndex(i, count) {
|
||||||
params.reserve_size = res;
|
Arena *fixed_arena = arena_alloc_(&(ArenaParams){ .reserve_size = res, .commit_size = cmt });
|
||||||
params.commit_size = cmt;
|
|
||||||
|
|
||||||
for (U64 i = 0; i < count; i += 1) {
|
|
||||||
Arena *fixed_arena = arena_alloc_(¶ms);
|
|
||||||
arr[i] = fixed_arena;
|
arr[i] = fixed_arena;
|
||||||
}
|
}
|
||||||
|
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
|
||||||
release_arena_array(Arena **arr)
|
|
||||||
{
|
|
||||||
U64 *count_ptr = (U64 *)arr - 1;
|
|
||||||
U64 count = *count_ptr;
|
|
||||||
for (U64 i = 0; i < count; i += 1) {
|
|
||||||
arena_release(arr[i]);
|
|
||||||
arr[i] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,11 +3,9 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
internal U64 * push_u64 (Arena *arena, U64 value);
|
internal U64 * push_u64 (Arena *arena, U64 value);
|
||||||
internal U32 * push_array_copy_u32(Arena *arena, U32 *v, U64 count);
|
internal U32 * push_array_copy_u32(Arena *arena, U32 *v, U64 count);
|
||||||
internal U64 * push_array_copy_u64(Arena *arena, U64 *v, U64 count);
|
internal U64 * push_array_copy_u64(Arena *arena, U64 *v, U64 count);
|
||||||
internal U64 ** push_matrix_u64 (Arena *arena, U64 rows, U64 columns);
|
|
||||||
|
|
||||||
internal Arena ** alloc_fixed_size_arena_array(Arena *arena, U64 count, U64 res, U64 cmt);
|
internal Arena ** alloc_fixed_size_arena_array(Arena *arena, U64 count, U64 res, U64 cmt);
|
||||||
internal void release_arena_array(Arena **arr);
|
#define alloc_arena_array(_arena_, _arena_count_, _counts_, T) alloc_arena_array_(_arena_, _arena_count_, _counts_, sizeof(T))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user