another buddy fix

This commit is contained in:
jacob 2025-02-09 16:25:59 -06:00
parent 110e28119c
commit cd38ab4fbf
3 changed files with 22 additions and 39 deletions

View File

@ -22,7 +22,6 @@ struct buddy_ctx *buddy_ctx_alloc(u64 reserve)
level->size = (u64)1 << i;
}
return ctx;
}
@ -73,18 +72,6 @@ INTERNAL struct buddy_block *buddy_block_get_unused(struct buddy_ctx *ctx, struc
{
struct buddy_block *block = NULL;
if (level->tier > 30) {
DEBUGBREAKABLE;
}
/* TODO: Tier oob check */
if (level->first_unused_block) {
block = level->first_unused_block;
@ -94,14 +81,12 @@ INTERNAL struct buddy_block *buddy_block_get_unused(struct buddy_ctx *ctx, struc
}
block->used = true;
block->next = NULL;
ASSERT(block->memory);
} else {
if (level->backed) {
struct buddy_level *parent_level = &ctx->levels[level->tier + 1];
struct buddy_block *parent_block = buddy_block_get_unused(ctx, parent_level);
ASSERT(parent_block->memory);
/* Create left block from parent block */
/* Create left (used) block from parent block */
struct buddy_block *left = buddy_block_alloc_internal(ctx);
left->used = true;
left->level = level;
@ -123,45 +108,36 @@ INTERNAL struct buddy_block *buddy_block_get_unused(struct buddy_ctx *ctx, struc
left->sibling = right;
right->sibling = left;
block = left;
ASSERT(block->memory);
} else {
#if 1
/* Create left block from arena */
struct arena *arena = &ctx->data_arena;
/* Grow arena */
i64 level_commit_diff = (level->size * 2) - arena->pos;
if (level_commit_diff > 0) {
arena_push_array(arena, u8, level_commit_diff);
ASSERT(arena->pos == (level->size * 2));
}
/* Create left (used) block from existing child block memory */
struct buddy_block *left = buddy_block_alloc_internal(ctx);
left->used = true;
left->level = level;
left->memory = arena_push_array(&ctx->data_arena, u8, level->size * 2);
left->memory = arena->base;
/* Create right (unused) block from arena */
/* Create right (unused) block from new arena memory */
struct buddy_block *right = buddy_block_alloc_internal(ctx);
right->used = false;
right->level = level;
right->memory = left->memory + level->size;
if (level->first_unused_block) {
right->next = level->first_unused_block;
level->first_unused_block->prev = right;
}
level->first_unused_block = right;
left->sibling = right;
right->sibling = left;
block = left;
level->backed = true;
ASSERT(block->memory);
#else
/* Create block by growing arena */
block = buddy_block_alloc_internal(ctx);
block->used = true;
block->memory = arena_push_array(&ctx->data_arena, u8, level->size);
block->level = level;
level->backed = true;
ASSERT(block->memory);
#endif
}
}
ASSERT(block->memory);
return block;
}
@ -190,8 +166,11 @@ struct buddy_block *buddy_alloc(struct buddy_ctx *ctx, u64 size)
{
if (size > 0x00FFFFFFFFFFFFFFULL) {
/* TODO: Error */
ASSERT(false);
}
/* TODO: Minimum block size */
u64 desired_block_size = 1;
u64 desired_level_tier = 0;
while (desired_block_size < size && desired_level_tier < 64) {

View File

@ -219,8 +219,8 @@ INTERNAL struct sim_ent *spawn_test_player(struct sim_ctx *ctx)
e->layer = SIM_LAYER_RELATIVE_WEAPON;
sim_ent_enable_prop(e, SIM_ENT_PROP_WEAPON);
e->trigger_delay = 1.0f / 10.0f;
//e->trigger_delay = 1.0f / 100.0f;
//e->trigger_delay = 1.0f / 10.0f;
e->trigger_delay = 1.0f / 100.0f;
player_ent->equipped = e->handle;
}

View File

@ -659,6 +659,10 @@ INTERNAL void user_update(void)
case SIM_EVENT_KIND_SNAPSHOT:
{
#if 0
u64 oldest_tick = snapshot_store_get_oldest_tick(G.snapshot_store);
u64 newest_tick = snapshot_store_get_newest_tick(G.snapshot_store);
#endif
struct string snapshot_data = event->snapshot_data;
sim_snapshot_decode(snapshot_data, &G.world, tick);
} break;